Skip to content

Commit d2ff6b8

Browse files
committed
Add more tests
1 parent b9709fb commit d2ff6b8

13 files changed

+259
-19
lines changed
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
//// [freshLiteralInference.ts]
2+
declare function f1<T extends "1" | "2" | "3">(x: T): T;
3+
4+
const value = f1("1"); // regular "1"
5+
let x1 = value; // regular "1"
6+
7+
declare function f2<T extends "1" | "2" | "3">(x: { value: T }): { value: T };
8+
9+
const obj2 = f2({ value: "1" }); // { value: regular "1" }
10+
let x2 = obj2.value; // regular "1"
11+
12+
declare function f3<T extends { value: "1" | "2" | "3" }>(obj: T): T;
13+
14+
const obj3 = f3({ value: "1" }); // before: { value: fresh "1" }
15+
let x3 = obj3.value; // before: string, after: "1"
16+
17+
18+
//// [freshLiteralInference.js]
19+
var value = f1("1"); // regular "1"
20+
var x1 = value; // regular "1"
21+
var obj2 = f2({ value: "1" }); // { value: regular "1" }
22+
var x2 = obj2.value; // regular "1"
23+
var obj3 = f3({ value: "1" }); // before: { value: fresh "1" }
24+
var x3 = obj3.value; // before: string, after: "1"
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
=== tests/cases/compiler/freshLiteralInference.ts ===
2+
declare function f1<T extends "1" | "2" | "3">(x: T): T;
3+
>f1 : Symbol(f1, Decl(freshLiteralInference.ts, 0, 0))
4+
>T : Symbol(T, Decl(freshLiteralInference.ts, 0, 20))
5+
>x : Symbol(x, Decl(freshLiteralInference.ts, 0, 47))
6+
>T : Symbol(T, Decl(freshLiteralInference.ts, 0, 20))
7+
>T : Symbol(T, Decl(freshLiteralInference.ts, 0, 20))
8+
9+
const value = f1("1"); // regular "1"
10+
>value : Symbol(value, Decl(freshLiteralInference.ts, 2, 5))
11+
>f1 : Symbol(f1, Decl(freshLiteralInference.ts, 0, 0))
12+
13+
let x1 = value; // regular "1"
14+
>x1 : Symbol(x1, Decl(freshLiteralInference.ts, 3, 3))
15+
>value : Symbol(value, Decl(freshLiteralInference.ts, 2, 5))
16+
17+
declare function f2<T extends "1" | "2" | "3">(x: { value: T }): { value: T };
18+
>f2 : Symbol(f2, Decl(freshLiteralInference.ts, 3, 15))
19+
>T : Symbol(T, Decl(freshLiteralInference.ts, 5, 20))
20+
>x : Symbol(x, Decl(freshLiteralInference.ts, 5, 47))
21+
>value : Symbol(value, Decl(freshLiteralInference.ts, 5, 51))
22+
>T : Symbol(T, Decl(freshLiteralInference.ts, 5, 20))
23+
>value : Symbol(value, Decl(freshLiteralInference.ts, 5, 66))
24+
>T : Symbol(T, Decl(freshLiteralInference.ts, 5, 20))
25+
26+
const obj2 = f2({ value: "1" }); // { value: regular "1" }
27+
>obj2 : Symbol(obj2, Decl(freshLiteralInference.ts, 7, 5))
28+
>f2 : Symbol(f2, Decl(freshLiteralInference.ts, 3, 15))
29+
>value : Symbol(value, Decl(freshLiteralInference.ts, 7, 17))
30+
31+
let x2 = obj2.value; // regular "1"
32+
>x2 : Symbol(x2, Decl(freshLiteralInference.ts, 8, 3))
33+
>obj2.value : Symbol(value, Decl(freshLiteralInference.ts, 5, 66))
34+
>obj2 : Symbol(obj2, Decl(freshLiteralInference.ts, 7, 5))
35+
>value : Symbol(value, Decl(freshLiteralInference.ts, 5, 66))
36+
37+
declare function f3<T extends { value: "1" | "2" | "3" }>(obj: T): T;
38+
>f3 : Symbol(f3, Decl(freshLiteralInference.ts, 8, 20))
39+
>T : Symbol(T, Decl(freshLiteralInference.ts, 10, 20))
40+
>value : Symbol(value, Decl(freshLiteralInference.ts, 10, 31))
41+
>obj : Symbol(obj, Decl(freshLiteralInference.ts, 10, 58))
42+
>T : Symbol(T, Decl(freshLiteralInference.ts, 10, 20))
43+
>T : Symbol(T, Decl(freshLiteralInference.ts, 10, 20))
44+
45+
const obj3 = f3({ value: "1" }); // before: { value: fresh "1" }
46+
>obj3 : Symbol(obj3, Decl(freshLiteralInference.ts, 12, 5))
47+
>f3 : Symbol(f3, Decl(freshLiteralInference.ts, 8, 20))
48+
>value : Symbol(value, Decl(freshLiteralInference.ts, 12, 17))
49+
50+
let x3 = obj3.value; // before: string, after: "1"
51+
>x3 : Symbol(x3, Decl(freshLiteralInference.ts, 13, 3))
52+
>obj3.value : Symbol(value, Decl(freshLiteralInference.ts, 12, 17))
53+
>obj3 : Symbol(obj3, Decl(freshLiteralInference.ts, 12, 5))
54+
>value : Symbol(value, Decl(freshLiteralInference.ts, 12, 17))
55+
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
=== tests/cases/compiler/freshLiteralInference.ts ===
2+
declare function f1<T extends "1" | "2" | "3">(x: T): T;
3+
>f1 : <T extends "1" | "2" | "3">(x: T) => T
4+
>x : T
5+
6+
const value = f1("1"); // regular "1"
7+
>value : "1"
8+
>f1("1") : "1"
9+
>f1 : <T extends "1" | "2" | "3">(x: T) => T
10+
>"1" : "1"
11+
12+
let x1 = value; // regular "1"
13+
>x1 : "1"
14+
>value : "1"
15+
16+
declare function f2<T extends "1" | "2" | "3">(x: { value: T }): { value: T };
17+
>f2 : <T extends "1" | "2" | "3">(x: { value: T;}) => { value: T;}
18+
>x : { value: T; }
19+
>value : T
20+
>value : T
21+
22+
const obj2 = f2({ value: "1" }); // { value: regular "1" }
23+
>obj2 : { value: "1"; }
24+
>f2({ value: "1" }) : { value: "1"; }
25+
>f2 : <T extends "1" | "2" | "3">(x: { value: T; }) => { value: T; }
26+
>{ value: "1" } : { value: "1"; }
27+
>value : "1"
28+
>"1" : "1"
29+
30+
let x2 = obj2.value; // regular "1"
31+
>x2 : "1"
32+
>obj2.value : "1"
33+
>obj2 : { value: "1"; }
34+
>value : "1"
35+
36+
declare function f3<T extends { value: "1" | "2" | "3" }>(obj: T): T;
37+
>f3 : <T extends { value: "1" | "2" | "3"; }>(obj: T) => T
38+
>value : "1" | "2" | "3"
39+
>obj : T
40+
41+
const obj3 = f3({ value: "1" }); // before: { value: fresh "1" }
42+
>obj3 : { value: "1"; }
43+
>f3({ value: "1" }) : { value: "1"; }
44+
>f3 : <T extends { value: "1" | "2" | "3"; }>(obj: T) => T
45+
>{ value: "1" } : { value: "1"; }
46+
>value : "1"
47+
>"1" : "1"
48+
49+
let x3 = obj3.value; // before: string, after: "1"
50+
>x3 : "1"
51+
>obj3.value : "1"
52+
>obj3 : { value: "1"; }
53+
>value : "1"
54+
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
tests/cases/compiler/objectFreezeLiteralsDontWiden.ts(7,1): error TS2322: Type '"latest"' is not assignable to type '"1011831"'.
2+
3+
4+
==== tests/cases/compiler/objectFreezeLiteralsDontWiden.ts (1 errors) ====
5+
const PUPPETEER_REVISIONS = Object.freeze({
6+
chromium: '1011831',
7+
firefox: 'latest',
8+
});
9+
10+
let preferredRevision = PUPPETEER_REVISIONS.chromium;
11+
preferredRevision = PUPPETEER_REVISIONS.firefox;
12+
~~~~~~~~~~~~~~~~~
13+
!!! error TS2322: Type '"latest"' is not assignable to type '"1011831"'.
14+
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
//// [objectFreezeLiteralsDontWiden.ts]
2+
const PUPPETEER_REVISIONS = Object.freeze({
3+
chromium: '1011831',
4+
firefox: 'latest',
5+
});
6+
7+
let preferredRevision = PUPPETEER_REVISIONS.chromium;
8+
preferredRevision = PUPPETEER_REVISIONS.firefox;
9+
10+
11+
//// [objectFreezeLiteralsDontWiden.js]
12+
var PUPPETEER_REVISIONS = Object.freeze({
13+
chromium: '1011831',
14+
firefox: 'latest'
15+
});
16+
var preferredRevision = PUPPETEER_REVISIONS.chromium;
17+
preferredRevision = PUPPETEER_REVISIONS.firefox;
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
=== tests/cases/compiler/objectFreezeLiteralsDontWiden.ts ===
2+
const PUPPETEER_REVISIONS = Object.freeze({
3+
>PUPPETEER_REVISIONS : Symbol(PUPPETEER_REVISIONS, Decl(objectFreezeLiteralsDontWiden.ts, 0, 5))
4+
>Object.freeze : Symbol(ObjectConstructor.freeze, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --))
5+
>Object : Symbol(Object, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --))
6+
>freeze : Symbol(ObjectConstructor.freeze, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --))
7+
8+
chromium: '1011831',
9+
>chromium : Symbol(chromium, Decl(objectFreezeLiteralsDontWiden.ts, 0, 43))
10+
11+
firefox: 'latest',
12+
>firefox : Symbol(firefox, Decl(objectFreezeLiteralsDontWiden.ts, 1, 22))
13+
14+
});
15+
16+
let preferredRevision = PUPPETEER_REVISIONS.chromium;
17+
>preferredRevision : Symbol(preferredRevision, Decl(objectFreezeLiteralsDontWiden.ts, 5, 3))
18+
>PUPPETEER_REVISIONS.chromium : Symbol(chromium, Decl(objectFreezeLiteralsDontWiden.ts, 0, 43))
19+
>PUPPETEER_REVISIONS : Symbol(PUPPETEER_REVISIONS, Decl(objectFreezeLiteralsDontWiden.ts, 0, 5))
20+
>chromium : Symbol(chromium, Decl(objectFreezeLiteralsDontWiden.ts, 0, 43))
21+
22+
preferredRevision = PUPPETEER_REVISIONS.firefox;
23+
>preferredRevision : Symbol(preferredRevision, Decl(objectFreezeLiteralsDontWiden.ts, 5, 3))
24+
>PUPPETEER_REVISIONS.firefox : Symbol(firefox, Decl(objectFreezeLiteralsDontWiden.ts, 1, 22))
25+
>PUPPETEER_REVISIONS : Symbol(PUPPETEER_REVISIONS, Decl(objectFreezeLiteralsDontWiden.ts, 0, 5))
26+
>firefox : Symbol(firefox, Decl(objectFreezeLiteralsDontWiden.ts, 1, 22))
27+
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
=== tests/cases/compiler/objectFreezeLiteralsDontWiden.ts ===
2+
const PUPPETEER_REVISIONS = Object.freeze({
3+
>PUPPETEER_REVISIONS : Readonly<{ chromium: "1011831"; firefox: "latest"; }>
4+
>Object.freeze({ chromium: '1011831', firefox: 'latest',}) : Readonly<{ chromium: "1011831"; firefox: "latest"; }>
5+
>Object.freeze : { <T>(a: T[]): readonly T[]; <T extends Function>(f: T): T; <T extends { [idx: string]: object | U; }, U extends string | number | bigint | boolean | symbol>(o: T): Readonly<T>; <T>(o: T): Readonly<T>; }
6+
>Object : ObjectConstructor
7+
>freeze : { <T>(a: T[]): readonly T[]; <T extends Function>(f: T): T; <T extends { [idx: string]: object | U; }, U extends string | number | bigint | boolean | symbol>(o: T): Readonly<T>; <T>(o: T): Readonly<T>; }
8+
>{ chromium: '1011831', firefox: 'latest',} : { chromium: "1011831"; firefox: "latest"; }
9+
10+
chromium: '1011831',
11+
>chromium : "1011831"
12+
>'1011831' : "1011831"
13+
14+
firefox: 'latest',
15+
>firefox : "latest"
16+
>'latest' : "latest"
17+
18+
});
19+
20+
let preferredRevision = PUPPETEER_REVISIONS.chromium;
21+
>preferredRevision : "1011831"
22+
>PUPPETEER_REVISIONS.chromium : "1011831"
23+
>PUPPETEER_REVISIONS : Readonly<{ chromium: "1011831"; firefox: "latest"; }>
24+
>chromium : "1011831"
25+
26+
preferredRevision = PUPPETEER_REVISIONS.firefox;
27+
>preferredRevision = PUPPETEER_REVISIONS.firefox : "latest"
28+
>preferredRevision : "1011831"
29+
>PUPPETEER_REVISIONS.firefox : "latest"
30+
>PUPPETEER_REVISIONS : Readonly<{ chromium: "1011831"; firefox: "latest"; }>
31+
>firefox : "latest"
32+

tests/baselines/reference/typePredicateFreshLiteralWidening.js

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,11 @@ const item1 = satisfies<Item>()({ value: "1" });
2020
const item2 = satisfies<Item>()({ value: "2" });
2121
const item3 = satisfies<Item>()({ value: null });
2222

23-
const values2: Array<"1" | "2" | null> = ["1", "2", null]; // same reported type as `values`
24-
const filteredValues2 = values2.filter(isNotNull); // `null` correctly gets excluded from type
23+
const values2: Array<"1" | "2" | null> = ["1", "2", null];
24+
const filteredValues2 = values2.filter(isNotNull);
2525

2626
const values1 = [item1, item2, item3].map(item => item.value);
27-
const filteredValues1 = values1.filter(isNotNull); // still contains `null` in type :(
28-
27+
const filteredValues1 = values1.filter(isNotNull);
2928

3029

3130
//// [typePredicateFreshLiteralWidening.js]
@@ -39,7 +38,7 @@ var isNotNull = function (value) { return value !== null; };
3938
var item1 = satisfies()({ value: "1" });
4039
var item2 = satisfies()({ value: "2" });
4140
var item3 = satisfies()({ value: null });
42-
var values2 = ["1", "2", null]; // same reported type as `values`
43-
var filteredValues2 = values2.filter(isNotNull); // `null` correctly gets excluded from type
41+
var values2 = ["1", "2", null];
42+
var filteredValues2 = values2.filter(isNotNull);
4443
var values1 = [item1, item2, item3].map(function (item) { return item.value; });
45-
var filteredValues1 = values1.filter(isNotNull); // still contains `null` in type :(
44+
var filteredValues1 = values1.filter(isNotNull);

tests/baselines/reference/typePredicateFreshLiteralWidening.symbols

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -67,11 +67,11 @@ const item3 = satisfies<Item>()({ value: null });
6767
>Item : Symbol(Item, Decl(typePredicateFreshLiteralWidening.ts, 13, 70))
6868
>value : Symbol(value, Decl(typePredicateFreshLiteralWidening.ts, 19, 33))
6969

70-
const values2: Array<"1" | "2" | null> = ["1", "2", null]; // same reported type as `values`
70+
const values2: Array<"1" | "2" | null> = ["1", "2", null];
7171
>values2 : Symbol(values2, Decl(typePredicateFreshLiteralWidening.ts, 21, 5))
7272
>Array : Symbol(Array, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --))
7373

74-
const filteredValues2 = values2.filter(isNotNull); // `null` correctly gets excluded from type
74+
const filteredValues2 = values2.filter(isNotNull);
7575
>filteredValues2 : Symbol(filteredValues2, Decl(typePredicateFreshLiteralWidening.ts, 22, 5))
7676
>values2.filter : Symbol(Array.filter, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --))
7777
>values2 : Symbol(values2, Decl(typePredicateFreshLiteralWidening.ts, 21, 5))
@@ -90,11 +90,10 @@ const values1 = [item1, item2, item3].map(item => item.value);
9090
>item : Symbol(item, Decl(typePredicateFreshLiteralWidening.ts, 24, 42))
9191
>value : Symbol(value, Decl(typePredicateFreshLiteralWidening.ts, 17, 33), Decl(typePredicateFreshLiteralWidening.ts, 18, 33), Decl(typePredicateFreshLiteralWidening.ts, 19, 33))
9292

93-
const filteredValues1 = values1.filter(isNotNull); // still contains `null` in type :(
93+
const filteredValues1 = values1.filter(isNotNull);
9494
>filteredValues1 : Symbol(filteredValues1, Decl(typePredicateFreshLiteralWidening.ts, 25, 5))
9595
>values1.filter : Symbol(Array.filter, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --))
9696
>values1 : Symbol(values1, Decl(typePredicateFreshLiteralWidening.ts, 24, 5))
9797
>filter : Symbol(Array.filter, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --))
9898
>isNotNull : Symbol(isNotNull, Decl(typePredicateFreshLiteralWidening.ts, 13, 5))
9999

100-

tests/baselines/reference/typePredicateFreshLiteralWidening.types

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -64,15 +64,15 @@ const item3 = satisfies<Item>()({ value: null });
6464
>value : null
6565
>null : null
6666

67-
const values2: Array<"1" | "2" | null> = ["1", "2", null]; // same reported type as `values`
67+
const values2: Array<"1" | "2" | null> = ["1", "2", null];
6868
>values2 : ("1" | "2" | null)[]
6969
>null : null
7070
>["1", "2", null] : ("1" | "2" | null)[]
7171
>"1" : "1"
7272
>"2" : "2"
7373
>null : null
7474

75-
const filteredValues2 = values2.filter(isNotNull); // `null` correctly gets excluded from type
75+
const filteredValues2 = values2.filter(isNotNull);
7676
>filteredValues2 : ("1" | "2")[]
7777
>values2.filter(isNotNull) : ("1" | "2")[]
7878
>values2.filter : { <S extends "1" | "2" | null>(predicate: (value: "1" | "2" | null, index: number, array: ("1" | "2" | null)[]) => value is S, thisArg?: any): S[]; (predicate: (value: "1" | "2" | null, index: number, array: ("1" | "2" | null)[]) => unknown, thisArg?: any): ("1" | "2" | null)[]; }
@@ -95,12 +95,11 @@ const values1 = [item1, item2, item3].map(item => item.value);
9595
>item : { value: "1"; } | { value: "2"; } | { value: null; }
9696
>value : "1" | "2" | null
9797

98-
const filteredValues1 = values1.filter(isNotNull); // still contains `null` in type :(
98+
const filteredValues1 = values1.filter(isNotNull);
9999
>filteredValues1 : ("1" | "2")[]
100100
>values1.filter(isNotNull) : ("1" | "2")[]
101101
>values1.filter : { <S extends "1" | "2" | null>(predicate: (value: "1" | "2" | null, index: number, array: ("1" | "2" | null)[]) => value is S, thisArg?: any): S[]; (predicate: (value: "1" | "2" | null, index: number, array: ("1" | "2" | null)[]) => unknown, thisArg?: any): ("1" | "2" | null)[]; }
102102
>values1 : ("1" | "2" | null)[]
103103
>filter : { <S extends "1" | "2" | null>(predicate: (value: "1" | "2" | null, index: number, array: ("1" | "2" | null)[]) => value is S, thisArg?: any): S[]; (predicate: (value: "1" | "2" | null, index: number, array: ("1" | "2" | null)[]) => unknown, thisArg?: any): ("1" | "2" | null)[]; }
104104
>isNotNull : <T>(value: T | null) => value is T
105105

106-

0 commit comments

Comments
 (0)