Skip to content

Commit fbfebe6

Browse files
committed
Add regression tests
1 parent 5f52201 commit fbfebe6

File tree

5 files changed

+247
-0
lines changed

5 files changed

+247
-0
lines changed
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
tests/cases/compiler/genericMappedTypeAsClause.ts(11,36): error TS2322: Type 'string' is not assignable to type 'number'.
2+
tests/cases/compiler/genericMappedTypeAsClause.ts(14,11): error TS2322: Type 'number' is not assignable to type 'MappedModel<T>'.
3+
tests/cases/compiler/genericMappedTypeAsClause.ts(15,11): error TS2322: Type 'string' is not assignable to type 'MappedModel<T>'.
4+
tests/cases/compiler/genericMappedTypeAsClause.ts(16,11): error TS2322: Type 'number[]' is not assignable to type 'MappedModel<T>'.
5+
tests/cases/compiler/genericMappedTypeAsClause.ts(17,11): error TS2322: Type 'boolean' is not assignable to type 'MappedModel<T>'.
6+
tests/cases/compiler/genericMappedTypeAsClause.ts(18,34): error TS2322: Type '{ a: string; b: number; }' is not assignable to type 'MappedModel<T>'.
7+
Object literal may only specify known properties, and 'a' does not exist in type 'MappedModel<T>'.
8+
tests/cases/compiler/genericMappedTypeAsClause.ts(19,11): error TS2322: Type 'undefined' is not assignable to type 'MappedModel<T>'.
9+
10+
11+
==== tests/cases/compiler/genericMappedTypeAsClause.ts (7 errors) ====
12+
type Model = {
13+
a: string;
14+
b: number;
15+
};
16+
17+
type MappedModel<Suffix extends string> = {
18+
[K in keyof Model as `${K}${Suffix}`]: Model[K];
19+
};
20+
21+
const foo1: MappedModel<'Foo'> = { aFoo: 'test', bFoo: 42 };
22+
const foo2: MappedModel<'Foo'> = { bFoo: 'bar' }; // Error
23+
~~~~
24+
!!! error TS2322: Type 'string' is not assignable to type 'number'.
25+
!!! related TS6500 tests/cases/compiler/genericMappedTypeAsClause.ts:6:43: The expected type comes from property 'bFoo' which is declared here on type 'MappedModel<"Foo">'
26+
27+
function f1<T extends string>() {
28+
const x1: MappedModel<T> = 42; // Error
29+
~~
30+
!!! error TS2322: Type 'number' is not assignable to type 'MappedModel<T>'.
31+
const x2: MappedModel<T> = 'test'; // Error
32+
~~
33+
!!! error TS2322: Type 'string' is not assignable to type 'MappedModel<T>'.
34+
const x3: MappedModel<T> = [1, 2, 3]; // Error
35+
~~
36+
!!! error TS2322: Type 'number[]' is not assignable to type 'MappedModel<T>'.
37+
const x4: MappedModel<T> = false; // Error
38+
~~
39+
!!! error TS2322: Type 'boolean' is not assignable to type 'MappedModel<T>'.
40+
const x5: MappedModel<T> = { a: 'bar', b: 42 }; // Error
41+
~~~~~~~~
42+
!!! error TS2322: Type '{ a: string; b: number; }' is not assignable to type 'MappedModel<T>'.
43+
!!! error TS2322: Object literal may only specify known properties, and 'a' does not exist in type 'MappedModel<T>'.
44+
const x6: MappedModel<T> = undefined; // Error
45+
~~
46+
!!! error TS2322: Type 'undefined' is not assignable to type 'MappedModel<T>'.
47+
}
48+
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
//// [genericMappedTypeAsClause.ts]
2+
type Model = {
3+
a: string;
4+
b: number;
5+
};
6+
7+
type MappedModel<Suffix extends string> = {
8+
[K in keyof Model as `${K}${Suffix}`]: Model[K];
9+
};
10+
11+
const foo1: MappedModel<'Foo'> = { aFoo: 'test', bFoo: 42 };
12+
const foo2: MappedModel<'Foo'> = { bFoo: 'bar' }; // Error
13+
14+
function f1<T extends string>() {
15+
const x1: MappedModel<T> = 42; // Error
16+
const x2: MappedModel<T> = 'test'; // Error
17+
const x3: MappedModel<T> = [1, 2, 3]; // Error
18+
const x4: MappedModel<T> = false; // Error
19+
const x5: MappedModel<T> = { a: 'bar', b: 42 }; // Error
20+
const x6: MappedModel<T> = undefined; // Error
21+
}
22+
23+
24+
//// [genericMappedTypeAsClause.js]
25+
"use strict";
26+
var foo1 = { aFoo: 'test', bFoo: 42 };
27+
var foo2 = { bFoo: 'bar' }; // Error
28+
function f1() {
29+
var x1 = 42; // Error
30+
var x2 = 'test'; // Error
31+
var x3 = [1, 2, 3]; // Error
32+
var x4 = false; // Error
33+
var x5 = { a: 'bar', b: 42 }; // Error
34+
var x6 = undefined; // Error
35+
}
Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
=== tests/cases/compiler/genericMappedTypeAsClause.ts ===
2+
type Model = {
3+
>Model : Symbol(Model, Decl(genericMappedTypeAsClause.ts, 0, 0))
4+
5+
a: string;
6+
>a : Symbol(a, Decl(genericMappedTypeAsClause.ts, 0, 14))
7+
8+
b: number;
9+
>b : Symbol(b, Decl(genericMappedTypeAsClause.ts, 1, 14))
10+
11+
};
12+
13+
type MappedModel<Suffix extends string> = {
14+
>MappedModel : Symbol(MappedModel, Decl(genericMappedTypeAsClause.ts, 3, 2))
15+
>Suffix : Symbol(Suffix, Decl(genericMappedTypeAsClause.ts, 5, 17))
16+
17+
[K in keyof Model as `${K}${Suffix}`]: Model[K];
18+
>K : Symbol(K, Decl(genericMappedTypeAsClause.ts, 6, 5))
19+
>Model : Symbol(Model, Decl(genericMappedTypeAsClause.ts, 0, 0))
20+
>K : Symbol(K, Decl(genericMappedTypeAsClause.ts, 6, 5))
21+
>Suffix : Symbol(Suffix, Decl(genericMappedTypeAsClause.ts, 5, 17))
22+
>Model : Symbol(Model, Decl(genericMappedTypeAsClause.ts, 0, 0))
23+
>K : Symbol(K, Decl(genericMappedTypeAsClause.ts, 6, 5))
24+
25+
};
26+
27+
const foo1: MappedModel<'Foo'> = { aFoo: 'test', bFoo: 42 };
28+
>foo1 : Symbol(foo1, Decl(genericMappedTypeAsClause.ts, 9, 5))
29+
>MappedModel : Symbol(MappedModel, Decl(genericMappedTypeAsClause.ts, 3, 2))
30+
>aFoo : Symbol(aFoo, Decl(genericMappedTypeAsClause.ts, 9, 34))
31+
>bFoo : Symbol(bFoo, Decl(genericMappedTypeAsClause.ts, 9, 48))
32+
33+
const foo2: MappedModel<'Foo'> = { bFoo: 'bar' }; // Error
34+
>foo2 : Symbol(foo2, Decl(genericMappedTypeAsClause.ts, 10, 5))
35+
>MappedModel : Symbol(MappedModel, Decl(genericMappedTypeAsClause.ts, 3, 2))
36+
>bFoo : Symbol(bFoo, Decl(genericMappedTypeAsClause.ts, 10, 34))
37+
38+
function f1<T extends string>() {
39+
>f1 : Symbol(f1, Decl(genericMappedTypeAsClause.ts, 10, 49))
40+
>T : Symbol(T, Decl(genericMappedTypeAsClause.ts, 12, 12))
41+
42+
const x1: MappedModel<T> = 42; // Error
43+
>x1 : Symbol(x1, Decl(genericMappedTypeAsClause.ts, 13, 9))
44+
>MappedModel : Symbol(MappedModel, Decl(genericMappedTypeAsClause.ts, 3, 2))
45+
>T : Symbol(T, Decl(genericMappedTypeAsClause.ts, 12, 12))
46+
47+
const x2: MappedModel<T> = 'test'; // Error
48+
>x2 : Symbol(x2, Decl(genericMappedTypeAsClause.ts, 14, 9))
49+
>MappedModel : Symbol(MappedModel, Decl(genericMappedTypeAsClause.ts, 3, 2))
50+
>T : Symbol(T, Decl(genericMappedTypeAsClause.ts, 12, 12))
51+
52+
const x3: MappedModel<T> = [1, 2, 3]; // Error
53+
>x3 : Symbol(x3, Decl(genericMappedTypeAsClause.ts, 15, 9))
54+
>MappedModel : Symbol(MappedModel, Decl(genericMappedTypeAsClause.ts, 3, 2))
55+
>T : Symbol(T, Decl(genericMappedTypeAsClause.ts, 12, 12))
56+
57+
const x4: MappedModel<T> = false; // Error
58+
>x4 : Symbol(x4, Decl(genericMappedTypeAsClause.ts, 16, 9))
59+
>MappedModel : Symbol(MappedModel, Decl(genericMappedTypeAsClause.ts, 3, 2))
60+
>T : Symbol(T, Decl(genericMappedTypeAsClause.ts, 12, 12))
61+
62+
const x5: MappedModel<T> = { a: 'bar', b: 42 }; // Error
63+
>x5 : Symbol(x5, Decl(genericMappedTypeAsClause.ts, 17, 9))
64+
>MappedModel : Symbol(MappedModel, Decl(genericMappedTypeAsClause.ts, 3, 2))
65+
>T : Symbol(T, Decl(genericMappedTypeAsClause.ts, 12, 12))
66+
>a : Symbol(a, Decl(genericMappedTypeAsClause.ts, 17, 32))
67+
>b : Symbol(b, Decl(genericMappedTypeAsClause.ts, 17, 42))
68+
69+
const x6: MappedModel<T> = undefined; // Error
70+
>x6 : Symbol(x6, Decl(genericMappedTypeAsClause.ts, 18, 9))
71+
>MappedModel : Symbol(MappedModel, Decl(genericMappedTypeAsClause.ts, 3, 2))
72+
>T : Symbol(T, Decl(genericMappedTypeAsClause.ts, 12, 12))
73+
>undefined : Symbol(undefined)
74+
}
75+
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
=== tests/cases/compiler/genericMappedTypeAsClause.ts ===
2+
type Model = {
3+
>Model : { a: string; b: number; }
4+
5+
a: string;
6+
>a : string
7+
8+
b: number;
9+
>b : number
10+
11+
};
12+
13+
type MappedModel<Suffix extends string> = {
14+
>MappedModel : MappedModel<Suffix>
15+
16+
[K in keyof Model as `${K}${Suffix}`]: Model[K];
17+
};
18+
19+
const foo1: MappedModel<'Foo'> = { aFoo: 'test', bFoo: 42 };
20+
>foo1 : MappedModel<"Foo">
21+
>{ aFoo: 'test', bFoo: 42 } : { aFoo: string; bFoo: number; }
22+
>aFoo : string
23+
>'test' : "test"
24+
>bFoo : number
25+
>42 : 42
26+
27+
const foo2: MappedModel<'Foo'> = { bFoo: 'bar' }; // Error
28+
>foo2 : MappedModel<"Foo">
29+
>{ bFoo: 'bar' } : { bFoo: string; }
30+
>bFoo : string
31+
>'bar' : "bar"
32+
33+
function f1<T extends string>() {
34+
>f1 : <T extends string>() => void
35+
36+
const x1: MappedModel<T> = 42; // Error
37+
>x1 : MappedModel<T>
38+
>42 : 42
39+
40+
const x2: MappedModel<T> = 'test'; // Error
41+
>x2 : MappedModel<T>
42+
>'test' : "test"
43+
44+
const x3: MappedModel<T> = [1, 2, 3]; // Error
45+
>x3 : MappedModel<T>
46+
>[1, 2, 3] : number[]
47+
>1 : 1
48+
>2 : 2
49+
>3 : 3
50+
51+
const x4: MappedModel<T> = false; // Error
52+
>x4 : MappedModel<T>
53+
>false : false
54+
55+
const x5: MappedModel<T> = { a: 'bar', b: 42 }; // Error
56+
>x5 : MappedModel<T>
57+
>{ a: 'bar', b: 42 } : { a: string; b: number; }
58+
>a : string
59+
>'bar' : "bar"
60+
>b : number
61+
>42 : 42
62+
63+
const x6: MappedModel<T> = undefined; // Error
64+
>x6 : MappedModel<T>
65+
>undefined : undefined
66+
}
67+
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
// @strict: true
2+
3+
type Model = {
4+
a: string;
5+
b: number;
6+
};
7+
8+
type MappedModel<Suffix extends string> = {
9+
[K in keyof Model as `${K}${Suffix}`]: Model[K];
10+
};
11+
12+
const foo1: MappedModel<'Foo'> = { aFoo: 'test', bFoo: 42 };
13+
const foo2: MappedModel<'Foo'> = { bFoo: 'bar' }; // Error
14+
15+
function f1<T extends string>() {
16+
const x1: MappedModel<T> = 42; // Error
17+
const x2: MappedModel<T> = 'test'; // Error
18+
const x3: MappedModel<T> = [1, 2, 3]; // Error
19+
const x4: MappedModel<T> = false; // Error
20+
const x5: MappedModel<T> = { a: 'bar', b: 42 }; // Error
21+
const x6: MappedModel<T> = undefined; // Error
22+
}

0 commit comments

Comments
 (0)