Skip to content

Commit b6aff98

Browse files
committed
Add test relating type predicates with and without this parameters
1 parent 3dd0814 commit b6aff98

File tree

1 file changed

+27
-0
lines changed

1 file changed

+27
-0
lines changed
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
// @strict: true
2+
interface ListItem<TData> {
3+
prev: ListItem<TData> | null;
4+
next: ListItem<TData> | null;
5+
data: TData;
6+
}
7+
type IteratorFn<TData, TResult, TContext = List<TData>> = (this: TContext, item: TData, node: ListItem<TData>, list: List<TData>) => TResult;
8+
type FilterFn<TData, TResult extends TData, TContext = List<TData>> = (this: TContext, item: TData, node: ListItem<TData>, list: List<TData>) => item is TResult;
9+
10+
declare class List<TData> {
11+
filter<TContext, TResult extends TData>(fn: FilterFn<TData, TResult, TContext>, context: TContext): List<TResult>;
12+
filter<TResult extends TData>(fn: FilterFn<TData, TResult>): List<TResult>;
13+
filter<TContext>(fn: IteratorFn<TData, boolean, TContext>, context: TContext): List<TData>;
14+
filter(fn: IteratorFn<TData, boolean>): List<TData>;
15+
}
16+
interface Test {
17+
a: string;
18+
}
19+
const list2 = new List<Test | null>();
20+
const filter1 = list2.filter(function(item, node, list): item is Test {
21+
this.b; // $ExpectType string
22+
item; // $ExpectType Test | null
23+
node; // $ExpectType ListItem<Test | null>
24+
list; // $ExpectType List<Test | null>
25+
return !!item;
26+
}, {b: 'c'});
27+
const x: List<Test> = filter1; // $ExpectType List<Test>

0 commit comments

Comments
 (0)