Skip to content

Commit 518046c

Browse files
committed
Always propegate any as an index type
1 parent c881d97 commit 518046c

5 files changed

+273
-0
lines changed

src/compiler/checker.ts

+3
Original file line numberDiff line numberDiff line change
@@ -9200,6 +9200,9 @@ namespace ts {
92009200
error(indexNode, Diagnostics.Type_0_cannot_be_used_as_an_index_type, typeToString(indexType));
92019201
}
92029202
}
9203+
if (isTypeAny(indexType)) {
9204+
return indexType;
9205+
}
92039206
return accessNode ? errorType : unknownType;
92049207
}
92059208

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
//// [varianceCallbacksAndIndexedAccesses.ts]
2+
type Source = {
3+
<K extends keyof WindowEventMap>(type: K, listener: (this: Window, ev: WindowEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
4+
(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
5+
}
6+
7+
interface Action1<T> {
8+
(arg: T): void;
9+
}
10+
interface MessageEventLike<T> {
11+
source: WindowLike<T>;
12+
origin: string;
13+
data: T;
14+
}
15+
interface PostMessageObject<T> {
16+
postMessage(message: T, host: string): void;
17+
}
18+
interface WindowLike<T> extends PostMessageObject<T> {
19+
addEventListener(type: "message", handler: Action1<MessageEventLike<T>>): void;
20+
addEventListener(type: string, handler: Action1<any>): void;
21+
removeEventListener(type: "message", handler: Action1<MessageEventLike<T>>): void;
22+
removeEventListener(type: string, handler: Action1<any>): void;
23+
}
24+
type Target = {
25+
(type: "message", handler: Action1<MessageEventLike<any>>): void;
26+
(type: string, handler: Action1<any>): void;
27+
};
28+
29+
function f1(s: Source, t: Target) {
30+
t = s;
31+
}
32+
33+
//// [varianceCallbacksAndIndexedAccesses.js]
34+
function f1(s, t) {
35+
t = s;
36+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,121 @@
1+
=== tests/cases/compiler/varianceCallbacksAndIndexedAccesses.ts ===
2+
type Source = {
3+
>Source : Symbol(Source, Decl(varianceCallbacksAndIndexedAccesses.ts, 0, 0))
4+
5+
<K extends keyof WindowEventMap>(type: K, listener: (this: Window, ev: WindowEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
6+
>K : Symbol(K, Decl(varianceCallbacksAndIndexedAccesses.ts, 1, 5))
7+
>WindowEventMap : Symbol(WindowEventMap, Decl(lib.dom.d.ts, --, --))
8+
>type : Symbol(type, Decl(varianceCallbacksAndIndexedAccesses.ts, 1, 37))
9+
>K : Symbol(K, Decl(varianceCallbacksAndIndexedAccesses.ts, 1, 5))
10+
>listener : Symbol(listener, Decl(varianceCallbacksAndIndexedAccesses.ts, 1, 45))
11+
>this : Symbol(this, Decl(varianceCallbacksAndIndexedAccesses.ts, 1, 57))
12+
>Window : Symbol(Window, Decl(lib.dom.d.ts, --, --), Decl(lib.dom.d.ts, --, --))
13+
>ev : Symbol(ev, Decl(varianceCallbacksAndIndexedAccesses.ts, 1, 70))
14+
>WindowEventMap : Symbol(WindowEventMap, Decl(lib.dom.d.ts, --, --))
15+
>K : Symbol(K, Decl(varianceCallbacksAndIndexedAccesses.ts, 1, 5))
16+
>options : Symbol(options, Decl(varianceCallbacksAndIndexedAccesses.ts, 1, 101))
17+
>AddEventListenerOptions : Symbol(AddEventListenerOptions, Decl(lib.dom.d.ts, --, --))
18+
19+
(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
20+
>type : Symbol(type, Decl(varianceCallbacksAndIndexedAccesses.ts, 2, 3))
21+
>listener : Symbol(listener, Decl(varianceCallbacksAndIndexedAccesses.ts, 2, 16))
22+
>EventListenerOrEventListenerObject : Symbol(EventListenerOrEventListenerObject, Decl(lib.dom.d.ts, --, --))
23+
>options : Symbol(options, Decl(varianceCallbacksAndIndexedAccesses.ts, 2, 62))
24+
>AddEventListenerOptions : Symbol(AddEventListenerOptions, Decl(lib.dom.d.ts, --, --))
25+
}
26+
27+
interface Action1<T> {
28+
>Action1 : Symbol(Action1, Decl(varianceCallbacksAndIndexedAccesses.ts, 3, 1))
29+
>T : Symbol(T, Decl(varianceCallbacksAndIndexedAccesses.ts, 5, 18))
30+
31+
(arg: T): void;
32+
>arg : Symbol(arg, Decl(varianceCallbacksAndIndexedAccesses.ts, 6, 5))
33+
>T : Symbol(T, Decl(varianceCallbacksAndIndexedAccesses.ts, 5, 18))
34+
}
35+
interface MessageEventLike<T> {
36+
>MessageEventLike : Symbol(MessageEventLike, Decl(varianceCallbacksAndIndexedAccesses.ts, 7, 1))
37+
>T : Symbol(T, Decl(varianceCallbacksAndIndexedAccesses.ts, 8, 27))
38+
39+
source: WindowLike<T>;
40+
>source : Symbol(MessageEventLike.source, Decl(varianceCallbacksAndIndexedAccesses.ts, 8, 31))
41+
>WindowLike : Symbol(WindowLike, Decl(varianceCallbacksAndIndexedAccesses.ts, 15, 1))
42+
>T : Symbol(T, Decl(varianceCallbacksAndIndexedAccesses.ts, 8, 27))
43+
44+
origin: string;
45+
>origin : Symbol(MessageEventLike.origin, Decl(varianceCallbacksAndIndexedAccesses.ts, 9, 26))
46+
47+
data: T;
48+
>data : Symbol(MessageEventLike.data, Decl(varianceCallbacksAndIndexedAccesses.ts, 10, 19))
49+
>T : Symbol(T, Decl(varianceCallbacksAndIndexedAccesses.ts, 8, 27))
50+
}
51+
interface PostMessageObject<T> {
52+
>PostMessageObject : Symbol(PostMessageObject, Decl(varianceCallbacksAndIndexedAccesses.ts, 12, 1))
53+
>T : Symbol(T, Decl(varianceCallbacksAndIndexedAccesses.ts, 13, 28))
54+
55+
postMessage(message: T, host: string): void;
56+
>postMessage : Symbol(PostMessageObject.postMessage, Decl(varianceCallbacksAndIndexedAccesses.ts, 13, 32))
57+
>message : Symbol(message, Decl(varianceCallbacksAndIndexedAccesses.ts, 14, 16))
58+
>T : Symbol(T, Decl(varianceCallbacksAndIndexedAccesses.ts, 13, 28))
59+
>host : Symbol(host, Decl(varianceCallbacksAndIndexedAccesses.ts, 14, 27))
60+
}
61+
interface WindowLike<T> extends PostMessageObject<T> {
62+
>WindowLike : Symbol(WindowLike, Decl(varianceCallbacksAndIndexedAccesses.ts, 15, 1))
63+
>T : Symbol(T, Decl(varianceCallbacksAndIndexedAccesses.ts, 16, 21))
64+
>PostMessageObject : Symbol(PostMessageObject, Decl(varianceCallbacksAndIndexedAccesses.ts, 12, 1))
65+
>T : Symbol(T, Decl(varianceCallbacksAndIndexedAccesses.ts, 16, 21))
66+
67+
addEventListener(type: "message", handler: Action1<MessageEventLike<T>>): void;
68+
>addEventListener : Symbol(WindowLike.addEventListener, Decl(varianceCallbacksAndIndexedAccesses.ts, 16, 54), Decl(varianceCallbacksAndIndexedAccesses.ts, 17, 83))
69+
>type : Symbol(type, Decl(varianceCallbacksAndIndexedAccesses.ts, 17, 21))
70+
>handler : Symbol(handler, Decl(varianceCallbacksAndIndexedAccesses.ts, 17, 37))
71+
>Action1 : Symbol(Action1, Decl(varianceCallbacksAndIndexedAccesses.ts, 3, 1))
72+
>MessageEventLike : Symbol(MessageEventLike, Decl(varianceCallbacksAndIndexedAccesses.ts, 7, 1))
73+
>T : Symbol(T, Decl(varianceCallbacksAndIndexedAccesses.ts, 16, 21))
74+
75+
addEventListener(type: string, handler: Action1<any>): void;
76+
>addEventListener : Symbol(WindowLike.addEventListener, Decl(varianceCallbacksAndIndexedAccesses.ts, 16, 54), Decl(varianceCallbacksAndIndexedAccesses.ts, 17, 83))
77+
>type : Symbol(type, Decl(varianceCallbacksAndIndexedAccesses.ts, 18, 21))
78+
>handler : Symbol(handler, Decl(varianceCallbacksAndIndexedAccesses.ts, 18, 34))
79+
>Action1 : Symbol(Action1, Decl(varianceCallbacksAndIndexedAccesses.ts, 3, 1))
80+
81+
removeEventListener(type: "message", handler: Action1<MessageEventLike<T>>): void;
82+
>removeEventListener : Symbol(WindowLike.removeEventListener, Decl(varianceCallbacksAndIndexedAccesses.ts, 18, 64), Decl(varianceCallbacksAndIndexedAccesses.ts, 19, 86))
83+
>type : Symbol(type, Decl(varianceCallbacksAndIndexedAccesses.ts, 19, 24))
84+
>handler : Symbol(handler, Decl(varianceCallbacksAndIndexedAccesses.ts, 19, 40))
85+
>Action1 : Symbol(Action1, Decl(varianceCallbacksAndIndexedAccesses.ts, 3, 1))
86+
>MessageEventLike : Symbol(MessageEventLike, Decl(varianceCallbacksAndIndexedAccesses.ts, 7, 1))
87+
>T : Symbol(T, Decl(varianceCallbacksAndIndexedAccesses.ts, 16, 21))
88+
89+
removeEventListener(type: string, handler: Action1<any>): void;
90+
>removeEventListener : Symbol(WindowLike.removeEventListener, Decl(varianceCallbacksAndIndexedAccesses.ts, 18, 64), Decl(varianceCallbacksAndIndexedAccesses.ts, 19, 86))
91+
>type : Symbol(type, Decl(varianceCallbacksAndIndexedAccesses.ts, 20, 24))
92+
>handler : Symbol(handler, Decl(varianceCallbacksAndIndexedAccesses.ts, 20, 37))
93+
>Action1 : Symbol(Action1, Decl(varianceCallbacksAndIndexedAccesses.ts, 3, 1))
94+
}
95+
type Target = {
96+
>Target : Symbol(Target, Decl(varianceCallbacksAndIndexedAccesses.ts, 21, 1))
97+
98+
(type: "message", handler: Action1<MessageEventLike<any>>): void;
99+
>type : Symbol(type, Decl(varianceCallbacksAndIndexedAccesses.ts, 23, 5))
100+
>handler : Symbol(handler, Decl(varianceCallbacksAndIndexedAccesses.ts, 23, 21))
101+
>Action1 : Symbol(Action1, Decl(varianceCallbacksAndIndexedAccesses.ts, 3, 1))
102+
>MessageEventLike : Symbol(MessageEventLike, Decl(varianceCallbacksAndIndexedAccesses.ts, 7, 1))
103+
104+
(type: string, handler: Action1<any>): void;
105+
>type : Symbol(type, Decl(varianceCallbacksAndIndexedAccesses.ts, 24, 5))
106+
>handler : Symbol(handler, Decl(varianceCallbacksAndIndexedAccesses.ts, 24, 18))
107+
>Action1 : Symbol(Action1, Decl(varianceCallbacksAndIndexedAccesses.ts, 3, 1))
108+
109+
};
110+
111+
function f1(s: Source, t: Target) {
112+
>f1 : Symbol(f1, Decl(varianceCallbacksAndIndexedAccesses.ts, 25, 2))
113+
>s : Symbol(s, Decl(varianceCallbacksAndIndexedAccesses.ts, 27, 12))
114+
>Source : Symbol(Source, Decl(varianceCallbacksAndIndexedAccesses.ts, 0, 0))
115+
>t : Symbol(t, Decl(varianceCallbacksAndIndexedAccesses.ts, 27, 22))
116+
>Target : Symbol(Target, Decl(varianceCallbacksAndIndexedAccesses.ts, 21, 1))
117+
118+
t = s;
119+
>t : Symbol(t, Decl(varianceCallbacksAndIndexedAccesses.ts, 27, 22))
120+
>s : Symbol(s, Decl(varianceCallbacksAndIndexedAccesses.ts, 27, 12))
121+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
=== tests/cases/compiler/varianceCallbacksAndIndexedAccesses.ts ===
2+
type Source = {
3+
>Source : Source
4+
5+
<K extends keyof WindowEventMap>(type: K, listener: (this: Window, ev: WindowEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
6+
>type : K
7+
>listener : (this: Window, ev: WindowEventMap[K]) => any
8+
>this : Window
9+
>ev : WindowEventMap[K]
10+
>options : boolean | AddEventListenerOptions
11+
12+
(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
13+
>type : string
14+
>listener : EventListenerOrEventListenerObject
15+
>options : boolean | AddEventListenerOptions
16+
}
17+
18+
interface Action1<T> {
19+
(arg: T): void;
20+
>arg : T
21+
}
22+
interface MessageEventLike<T> {
23+
source: WindowLike<T>;
24+
>source : WindowLike<T>
25+
26+
origin: string;
27+
>origin : string
28+
29+
data: T;
30+
>data : T
31+
}
32+
interface PostMessageObject<T> {
33+
postMessage(message: T, host: string): void;
34+
>postMessage : (message: T, host: string) => void
35+
>message : T
36+
>host : string
37+
}
38+
interface WindowLike<T> extends PostMessageObject<T> {
39+
addEventListener(type: "message", handler: Action1<MessageEventLike<T>>): void;
40+
>addEventListener : { (type: "message", handler: Action1<MessageEventLike<T>>): void; (type: string, handler: Action1<any>): void; }
41+
>type : "message"
42+
>handler : Action1<MessageEventLike<T>>
43+
44+
addEventListener(type: string, handler: Action1<any>): void;
45+
>addEventListener : { (type: "message", handler: Action1<MessageEventLike<T>>): void; (type: string, handler: Action1<any>): void; }
46+
>type : string
47+
>handler : Action1<any>
48+
49+
removeEventListener(type: "message", handler: Action1<MessageEventLike<T>>): void;
50+
>removeEventListener : { (type: "message", handler: Action1<MessageEventLike<T>>): void; (type: string, handler: Action1<any>): void; }
51+
>type : "message"
52+
>handler : Action1<MessageEventLike<T>>
53+
54+
removeEventListener(type: string, handler: Action1<any>): void;
55+
>removeEventListener : { (type: "message", handler: Action1<MessageEventLike<T>>): void; (type: string, handler: Action1<any>): void; }
56+
>type : string
57+
>handler : Action1<any>
58+
}
59+
type Target = {
60+
>Target : Target
61+
62+
(type: "message", handler: Action1<MessageEventLike<any>>): void;
63+
>type : "message"
64+
>handler : Action1<MessageEventLike<any>>
65+
66+
(type: string, handler: Action1<any>): void;
67+
>type : string
68+
>handler : Action1<any>
69+
70+
};
71+
72+
function f1(s: Source, t: Target) {
73+
>f1 : (s: Source, t: Target) => void
74+
>s : Source
75+
>t : Target
76+
77+
t = s;
78+
>t = s : Source
79+
>t : Target
80+
>s : Source
81+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
2+
3+
type Source = {
4+
<K extends keyof WindowEventMap>(type: K, listener: (this: Window, ev: WindowEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
5+
(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
6+
}
7+
8+
interface Action1<T> {
9+
(arg: T): void;
10+
}
11+
interface MessageEventLike<T> {
12+
source: WindowLike<T>;
13+
origin: string;
14+
data: T;
15+
}
16+
interface PostMessageObject<T> {
17+
postMessage(message: T, host: string): void;
18+
}
19+
interface WindowLike<T> extends PostMessageObject<T> {
20+
addEventListener(type: "message", handler: Action1<MessageEventLike<T>>): void;
21+
addEventListener(type: string, handler: Action1<any>): void;
22+
removeEventListener(type: "message", handler: Action1<MessageEventLike<T>>): void;
23+
removeEventListener(type: string, handler: Action1<any>): void;
24+
}
25+
type Target = {
26+
(type: "message", handler: Action1<MessageEventLike<any>>): void;
27+
(type: string, handler: Action1<any>): void;
28+
};
29+
30+
function f1(s: Source, t: Target) {
31+
t = s;
32+
}

0 commit comments

Comments
 (0)