Skip to content

Commit 2a7fc1e

Browse files
committed
Add tests
1 parent 71a2b47 commit 2a7fc1e

File tree

4 files changed

+344
-0
lines changed

4 files changed

+344
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
//// [numericStringLiteralTypes.ts]
2+
type T0 = string & `${string}`; // string
3+
type T1 = string & `${number}`; // `${number}
4+
type T2 = string & `${bigint}`; // `${bigint}
5+
type T3<T extends string> = string & `${T}`; // `${T}
6+
type T4<T extends string> = string & `${Capitalize<`${T}`>}`; // `${Capitalize<T>}`
7+
8+
function f1(a: boolean[], x: `${number}`) {
9+
let s = a[x]; // boolean
10+
}
11+
12+
function f2(a: boolean[], x: number | `${number}`) {
13+
let s = a[x]; // boolean
14+
}
15+
16+
type T10 = boolean[][`${number}`]; // boolean
17+
type T11 = boolean[][number | `${number}`]; // boolean
18+
19+
type T20<T extends number | `${number}`> = T;
20+
type T21<T extends unknown[]> = { [K in keyof T]: T20<K> };
21+
22+
type Container<T> = {
23+
value: T
24+
}
25+
26+
type UnwrapContainers<T extends Container<unknown>[]> = { [K in keyof T]: T[K]['value'] };
27+
28+
declare function createContainer<T extends unknown>(value: T): Container<T>;
29+
30+
declare function f<T extends Container<unknown>[]>(containers: [...T], callback: (...values: UnwrapContainers<T>) => void): void;
31+
32+
const container1 = createContainer('hi')
33+
const container2 = createContainer(2)
34+
35+
f([container1, container2], (value1, value2) => {
36+
value1; // string
37+
value2; // number
38+
});
39+
40+
41+
//// [numericStringLiteralTypes.js]
42+
"use strict";
43+
function f1(a, x) {
44+
var s = a[x]; // boolean
45+
}
46+
function f2(a, x) {
47+
var s = a[x]; // boolean
48+
}
49+
var container1 = createContainer('hi');
50+
var container2 = createContainer(2);
51+
f([container1, container2], function (value1, value2) {
52+
value1; // string
53+
value2; // number
54+
});
55+
56+
57+
//// [numericStringLiteralTypes.d.ts]
58+
declare type T0 = string & `${string}`;
59+
declare type T1 = string & `${number}`;
60+
declare type T2 = string & `${bigint}`;
61+
declare type T3<T extends string> = string & `${T}`;
62+
declare type T4<T extends string> = string & `${Capitalize<`${T}`>}`;
63+
declare function f1(a: boolean[], x: `${number}`): void;
64+
declare function f2(a: boolean[], x: number | `${number}`): void;
65+
declare type T10 = boolean[][`${number}`];
66+
declare type T11 = boolean[][number | `${number}`];
67+
declare type T20<T extends number | `${number}`> = T;
68+
declare type T21<T extends unknown[]> = {
69+
[K in keyof T]: T20<K>;
70+
};
71+
declare type Container<T> = {
72+
value: T;
73+
};
74+
declare type UnwrapContainers<T extends Container<unknown>[]> = {
75+
[K in keyof T]: T[K]['value'];
76+
};
77+
declare function createContainer<T extends unknown>(value: T): Container<T>;
78+
declare function f<T extends Container<unknown>[]>(containers: [...T], callback: (...values: UnwrapContainers<T>) => void): void;
79+
declare const container1: Container<string>;
80+
declare const container2: Container<number>;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,122 @@
1+
=== tests/cases/conformance/types/literal/numericStringLiteralTypes.ts ===
2+
type T0 = string & `${string}`; // string
3+
>T0 : Symbol(T0, Decl(numericStringLiteralTypes.ts, 0, 0))
4+
5+
type T1 = string & `${number}`; // `${number}
6+
>T1 : Symbol(T1, Decl(numericStringLiteralTypes.ts, 0, 31))
7+
8+
type T2 = string & `${bigint}`; // `${bigint}
9+
>T2 : Symbol(T2, Decl(numericStringLiteralTypes.ts, 1, 31))
10+
11+
type T3<T extends string> = string & `${T}`; // `${T}
12+
>T3 : Symbol(T3, Decl(numericStringLiteralTypes.ts, 2, 31))
13+
>T : Symbol(T, Decl(numericStringLiteralTypes.ts, 3, 8))
14+
>T : Symbol(T, Decl(numericStringLiteralTypes.ts, 3, 8))
15+
16+
type T4<T extends string> = string & `${Capitalize<`${T}`>}`; // `${Capitalize<T>}`
17+
>T4 : Symbol(T4, Decl(numericStringLiteralTypes.ts, 3, 44))
18+
>T : Symbol(T, Decl(numericStringLiteralTypes.ts, 4, 8))
19+
>Capitalize : Symbol(Capitalize, Decl(lib.es5.d.ts, --, --))
20+
>T : Symbol(T, Decl(numericStringLiteralTypes.ts, 4, 8))
21+
22+
function f1(a: boolean[], x: `${number}`) {
23+
>f1 : Symbol(f1, Decl(numericStringLiteralTypes.ts, 4, 61))
24+
>a : Symbol(a, Decl(numericStringLiteralTypes.ts, 6, 12))
25+
>x : Symbol(x, Decl(numericStringLiteralTypes.ts, 6, 25))
26+
27+
let s = a[x]; // boolean
28+
>s : Symbol(s, Decl(numericStringLiteralTypes.ts, 7, 7))
29+
>a : Symbol(a, Decl(numericStringLiteralTypes.ts, 6, 12))
30+
>x : Symbol(x, Decl(numericStringLiteralTypes.ts, 6, 25))
31+
}
32+
33+
function f2(a: boolean[], x: number | `${number}`) {
34+
>f2 : Symbol(f2, Decl(numericStringLiteralTypes.ts, 8, 1))
35+
>a : Symbol(a, Decl(numericStringLiteralTypes.ts, 10, 12))
36+
>x : Symbol(x, Decl(numericStringLiteralTypes.ts, 10, 25))
37+
38+
let s = a[x]; // boolean
39+
>s : Symbol(s, Decl(numericStringLiteralTypes.ts, 11, 7))
40+
>a : Symbol(a, Decl(numericStringLiteralTypes.ts, 10, 12))
41+
>x : Symbol(x, Decl(numericStringLiteralTypes.ts, 10, 25))
42+
}
43+
44+
type T10 = boolean[][`${number}`]; // boolean
45+
>T10 : Symbol(T10, Decl(numericStringLiteralTypes.ts, 12, 1))
46+
47+
type T11 = boolean[][number | `${number}`]; // boolean
48+
>T11 : Symbol(T11, Decl(numericStringLiteralTypes.ts, 14, 34))
49+
50+
type T20<T extends number | `${number}`> = T;
51+
>T20 : Symbol(T20, Decl(numericStringLiteralTypes.ts, 15, 43))
52+
>T : Symbol(T, Decl(numericStringLiteralTypes.ts, 17, 9))
53+
>T : Symbol(T, Decl(numericStringLiteralTypes.ts, 17, 9))
54+
55+
type T21<T extends unknown[]> = { [K in keyof T]: T20<K> };
56+
>T21 : Symbol(T21, Decl(numericStringLiteralTypes.ts, 17, 45))
57+
>T : Symbol(T, Decl(numericStringLiteralTypes.ts, 18, 9))
58+
>K : Symbol(K, Decl(numericStringLiteralTypes.ts, 18, 35))
59+
>T : Symbol(T, Decl(numericStringLiteralTypes.ts, 18, 9))
60+
>T20 : Symbol(T20, Decl(numericStringLiteralTypes.ts, 15, 43))
61+
>K : Symbol(K, Decl(numericStringLiteralTypes.ts, 18, 35))
62+
63+
type Container<T> = {
64+
>Container : Symbol(Container, Decl(numericStringLiteralTypes.ts, 18, 59))
65+
>T : Symbol(T, Decl(numericStringLiteralTypes.ts, 20, 15))
66+
67+
value: T
68+
>value : Symbol(value, Decl(numericStringLiteralTypes.ts, 20, 21))
69+
>T : Symbol(T, Decl(numericStringLiteralTypes.ts, 20, 15))
70+
}
71+
72+
type UnwrapContainers<T extends Container<unknown>[]> = { [K in keyof T]: T[K]['value'] };
73+
>UnwrapContainers : Symbol(UnwrapContainers, Decl(numericStringLiteralTypes.ts, 22, 1))
74+
>T : Symbol(T, Decl(numericStringLiteralTypes.ts, 24, 22))
75+
>Container : Symbol(Container, Decl(numericStringLiteralTypes.ts, 18, 59))
76+
>K : Symbol(K, Decl(numericStringLiteralTypes.ts, 24, 59))
77+
>T : Symbol(T, Decl(numericStringLiteralTypes.ts, 24, 22))
78+
>T : Symbol(T, Decl(numericStringLiteralTypes.ts, 24, 22))
79+
>K : Symbol(K, Decl(numericStringLiteralTypes.ts, 24, 59))
80+
81+
declare function createContainer<T extends unknown>(value: T): Container<T>;
82+
>createContainer : Symbol(createContainer, Decl(numericStringLiteralTypes.ts, 24, 90))
83+
>T : Symbol(T, Decl(numericStringLiteralTypes.ts, 26, 33))
84+
>value : Symbol(value, Decl(numericStringLiteralTypes.ts, 26, 52))
85+
>T : Symbol(T, Decl(numericStringLiteralTypes.ts, 26, 33))
86+
>Container : Symbol(Container, Decl(numericStringLiteralTypes.ts, 18, 59))
87+
>T : Symbol(T, Decl(numericStringLiteralTypes.ts, 26, 33))
88+
89+
declare function f<T extends Container<unknown>[]>(containers: [...T], callback: (...values: UnwrapContainers<T>) => void): void;
90+
>f : Symbol(f, Decl(numericStringLiteralTypes.ts, 26, 76))
91+
>T : Symbol(T, Decl(numericStringLiteralTypes.ts, 28, 19))
92+
>Container : Symbol(Container, Decl(numericStringLiteralTypes.ts, 18, 59))
93+
>containers : Symbol(containers, Decl(numericStringLiteralTypes.ts, 28, 51))
94+
>T : Symbol(T, Decl(numericStringLiteralTypes.ts, 28, 19))
95+
>callback : Symbol(callback, Decl(numericStringLiteralTypes.ts, 28, 70))
96+
>values : Symbol(values, Decl(numericStringLiteralTypes.ts, 28, 82))
97+
>UnwrapContainers : Symbol(UnwrapContainers, Decl(numericStringLiteralTypes.ts, 22, 1))
98+
>T : Symbol(T, Decl(numericStringLiteralTypes.ts, 28, 19))
99+
100+
const container1 = createContainer('hi')
101+
>container1 : Symbol(container1, Decl(numericStringLiteralTypes.ts, 30, 5))
102+
>createContainer : Symbol(createContainer, Decl(numericStringLiteralTypes.ts, 24, 90))
103+
104+
const container2 = createContainer(2)
105+
>container2 : Symbol(container2, Decl(numericStringLiteralTypes.ts, 31, 5))
106+
>createContainer : Symbol(createContainer, Decl(numericStringLiteralTypes.ts, 24, 90))
107+
108+
f([container1, container2], (value1, value2) => {
109+
>f : Symbol(f, Decl(numericStringLiteralTypes.ts, 26, 76))
110+
>container1 : Symbol(container1, Decl(numericStringLiteralTypes.ts, 30, 5))
111+
>container2 : Symbol(container2, Decl(numericStringLiteralTypes.ts, 31, 5))
112+
>value1 : Symbol(value1, Decl(numericStringLiteralTypes.ts, 33, 29))
113+
>value2 : Symbol(value2, Decl(numericStringLiteralTypes.ts, 33, 36))
114+
115+
value1; // string
116+
>value1 : Symbol(value1, Decl(numericStringLiteralTypes.ts, 33, 29))
117+
118+
value2; // number
119+
>value2 : Symbol(value2, Decl(numericStringLiteralTypes.ts, 33, 36))
120+
121+
});
122+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
=== tests/cases/conformance/types/literal/numericStringLiteralTypes.ts ===
2+
type T0 = string & `${string}`; // string
3+
>T0 : string
4+
5+
type T1 = string & `${number}`; // `${number}
6+
>T1 : `${number}`
7+
8+
type T2 = string & `${bigint}`; // `${bigint}
9+
>T2 : `${bigint}`
10+
11+
type T3<T extends string> = string & `${T}`; // `${T}
12+
>T3 : `${T}`
13+
14+
type T4<T extends string> = string & `${Capitalize<`${T}`>}`; // `${Capitalize<T>}`
15+
>T4 : `${Capitalize<`${T}`>}`
16+
17+
function f1(a: boolean[], x: `${number}`) {
18+
>f1 : (a: boolean[], x: `${number}`) => void
19+
>a : boolean[]
20+
>x : `${number}`
21+
22+
let s = a[x]; // boolean
23+
>s : boolean
24+
>a[x] : boolean
25+
>a : boolean[]
26+
>x : `${number}`
27+
}
28+
29+
function f2(a: boolean[], x: number | `${number}`) {
30+
>f2 : (a: boolean[], x: number | `${number}`) => void
31+
>a : boolean[]
32+
>x : number | `${number}`
33+
34+
let s = a[x]; // boolean
35+
>s : boolean
36+
>a[x] : boolean
37+
>a : boolean[]
38+
>x : number | `${number}`
39+
}
40+
41+
type T10 = boolean[][`${number}`]; // boolean
42+
>T10 : boolean
43+
44+
type T11 = boolean[][number | `${number}`]; // boolean
45+
>T11 : boolean
46+
47+
type T20<T extends number | `${number}`> = T;
48+
>T20 : T
49+
50+
type T21<T extends unknown[]> = { [K in keyof T]: T20<K> };
51+
>T21 : T21<T>
52+
53+
type Container<T> = {
54+
>Container : Container<T>
55+
56+
value: T
57+
>value : T
58+
}
59+
60+
type UnwrapContainers<T extends Container<unknown>[]> = { [K in keyof T]: T[K]['value'] };
61+
>UnwrapContainers : UnwrapContainers<T>
62+
63+
declare function createContainer<T extends unknown>(value: T): Container<T>;
64+
>createContainer : <T extends unknown>(value: T) => Container<T>
65+
>value : T
66+
67+
declare function f<T extends Container<unknown>[]>(containers: [...T], callback: (...values: UnwrapContainers<T>) => void): void;
68+
>f : <T extends Container<unknown>[]>(containers: [...T], callback: (...values: UnwrapContainers<T>) => void) => void
69+
>containers : [...T]
70+
>callback : (...values: UnwrapContainers<T>) => void
71+
>values : UnwrapContainers<T>
72+
73+
const container1 = createContainer('hi')
74+
>container1 : Container<string>
75+
>createContainer('hi') : Container<string>
76+
>createContainer : <T extends unknown>(value: T) => Container<T>
77+
>'hi' : "hi"
78+
79+
const container2 = createContainer(2)
80+
>container2 : Container<number>
81+
>createContainer(2) : Container<number>
82+
>createContainer : <T extends unknown>(value: T) => Container<T>
83+
>2 : 2
84+
85+
f([container1, container2], (value1, value2) => {
86+
>f([container1, container2], (value1, value2) => { value1; // string value2; // number}) : void
87+
>f : <T extends Container<unknown>[]>(containers: [...T], callback: (...values: UnwrapContainers<T>) => void) => void
88+
>[container1, container2] : [Container<string>, Container<number>]
89+
>container1 : Container<string>
90+
>container2 : Container<number>
91+
>(value1, value2) => { value1; // string value2; // number} : (value1: string, value2: number) => void
92+
>value1 : string
93+
>value2 : number
94+
95+
value1; // string
96+
>value1 : string
97+
98+
value2; // number
99+
>value2 : number
100+
101+
});
102+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
// @strict: true
2+
// @declaration: true
3+
4+
type T0 = string & `${string}`; // string
5+
type T1 = string & `${number}`; // `${number}
6+
type T2 = string & `${bigint}`; // `${bigint}
7+
type T3<T extends string> = string & `${T}`; // `${T}
8+
type T4<T extends string> = string & `${Capitalize<`${T}`>}`; // `${Capitalize<T>}`
9+
10+
function f1(a: boolean[], x: `${number}`) {
11+
let s = a[x]; // boolean
12+
}
13+
14+
function f2(a: boolean[], x: number | `${number}`) {
15+
let s = a[x]; // boolean
16+
}
17+
18+
type T10 = boolean[][`${number}`]; // boolean
19+
type T11 = boolean[][number | `${number}`]; // boolean
20+
21+
type T20<T extends number | `${number}`> = T;
22+
type T21<T extends unknown[]> = { [K in keyof T]: T20<K> };
23+
24+
type Container<T> = {
25+
value: T
26+
}
27+
28+
type UnwrapContainers<T extends Container<unknown>[]> = { [K in keyof T]: T[K]['value'] };
29+
30+
declare function createContainer<T extends unknown>(value: T): Container<T>;
31+
32+
declare function f<T extends Container<unknown>[]>(containers: [...T], callback: (...values: UnwrapContainers<T>) => void): void;
33+
34+
const container1 = createContainer('hi')
35+
const container2 = createContainer(2)
36+
37+
f([container1, container2], (value1, value2) => {
38+
value1; // string
39+
value2; // number
40+
});

0 commit comments

Comments
 (0)