``` arr.filter((a: A): a is A & { kind: 'bar'} => a.kind === 'bar') ```
If you define:
``` function isKind<K extends A['kind']>(kind: K): (a: A) => a is A & { kind: K } { return (a): a is A & { kind: K } => a.kind === kind; } ```
Then you can write:
``` arr.filter(isKind('bar')) ```
and get a properly narrowed return type array
``` arr.filter((a: A): a is A & { kind: 'bar'} => a.kind === 'bar') ```
If you define:
``` function isKind<K extends A['kind']>(kind: K): (a: A) => a is A & { kind: K } { return (a): a is A & { kind: K } => a.kind === kind; } ```
Then you can write:
``` arr.filter(isKind('bar')) ```
and get a properly narrowed return type array