diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 800f78ecad6..f79b04904b1 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -20443,7 +20443,7 @@ namespace ts { function getArrayifiedType(type: Type) { if (forEachType(type, t => !(t.flags & (TypeFlags.Any | TypeFlags.Instantiable) || isArrayType(t) || isTupleType(t)))) { - return createArrayType(getIndexTypeOfType(type, IndexKind.Number) || errorType); + return createArrayType(getIndexedAccessType(type, numberType)); } return type; } diff --git a/tests/baselines/reference/restTypeRetainsMappyness.errors.txt b/tests/baselines/reference/restTypeRetainsMappyness.errors.txt new file mode 100644 index 00000000000..26cc5db846d --- /dev/null +++ b/tests/baselines/reference/restTypeRetainsMappyness.errors.txt @@ -0,0 +1,15 @@ +tests/cases/compiler/restTypeRetainsMappyness.ts(7,8): error TS2345: Argument of type 'Foo[number][]' is not assignable to parameter of type 'Foo'. + + +==== tests/cases/compiler/restTypeRetainsMappyness.ts (1 errors) ==== + type Foo = { + [P in keyof T]: T[P] + } + + function test(fn: (...args: Foo) => void) { + const arr: Foo = {} as any + fn(...arr) // Error: Argument of type 'any[]' is not assignable to parameter of type 'Foo' + ~~~~~~ +!!! error TS2345: Argument of type 'Foo[number][]' is not assignable to parameter of type 'Foo'. + } + \ No newline at end of file diff --git a/tests/baselines/reference/restTypeRetainsMappyness.js b/tests/baselines/reference/restTypeRetainsMappyness.js new file mode 100644 index 00000000000..8bda2ece38c --- /dev/null +++ b/tests/baselines/reference/restTypeRetainsMappyness.js @@ -0,0 +1,16 @@ +//// [restTypeRetainsMappyness.ts] +type Foo = { + [P in keyof T]: T[P] +} + +function test(fn: (...args: Foo) => void) { + const arr: Foo = {} as any + fn(...arr) // Error: Argument of type 'any[]' is not assignable to parameter of type 'Foo' +} + + +//// [restTypeRetainsMappyness.js] +function test(fn) { + var arr = {}; + fn.apply(void 0, arr); // Error: Argument of type 'any[]' is not assignable to parameter of type 'Foo' +} diff --git a/tests/baselines/reference/restTypeRetainsMappyness.symbols b/tests/baselines/reference/restTypeRetainsMappyness.symbols new file mode 100644 index 00000000000..d56b6f4b5ae --- /dev/null +++ b/tests/baselines/reference/restTypeRetainsMappyness.symbols @@ -0,0 +1,30 @@ +=== tests/cases/compiler/restTypeRetainsMappyness.ts === +type Foo = { +>Foo : Symbol(Foo, Decl(restTypeRetainsMappyness.ts, 0, 0)) +>T : Symbol(T, Decl(restTypeRetainsMappyness.ts, 0, 9)) + + [P in keyof T]: T[P] +>P : Symbol(P, Decl(restTypeRetainsMappyness.ts, 1, 5)) +>T : Symbol(T, Decl(restTypeRetainsMappyness.ts, 0, 9)) +>T : Symbol(T, Decl(restTypeRetainsMappyness.ts, 0, 9)) +>P : Symbol(P, Decl(restTypeRetainsMappyness.ts, 1, 5)) +} + +function test(fn: (...args: Foo) => void) { +>test : Symbol(test, Decl(restTypeRetainsMappyness.ts, 2, 1)) +>T : Symbol(T, Decl(restTypeRetainsMappyness.ts, 4, 14)) +>fn : Symbol(fn, Decl(restTypeRetainsMappyness.ts, 4, 31)) +>args : Symbol(args, Decl(restTypeRetainsMappyness.ts, 4, 36)) +>Foo : Symbol(Foo, Decl(restTypeRetainsMappyness.ts, 0, 0)) +>T : Symbol(T, Decl(restTypeRetainsMappyness.ts, 4, 14)) + + const arr: Foo = {} as any +>arr : Symbol(arr, Decl(restTypeRetainsMappyness.ts, 5, 9)) +>Foo : Symbol(Foo, Decl(restTypeRetainsMappyness.ts, 0, 0)) +>T : Symbol(T, Decl(restTypeRetainsMappyness.ts, 4, 14)) + + fn(...arr) // Error: Argument of type 'any[]' is not assignable to parameter of type 'Foo' +>fn : Symbol(fn, Decl(restTypeRetainsMappyness.ts, 4, 31)) +>arr : Symbol(arr, Decl(restTypeRetainsMappyness.ts, 5, 9)) +} + diff --git a/tests/baselines/reference/restTypeRetainsMappyness.types b/tests/baselines/reference/restTypeRetainsMappyness.types new file mode 100644 index 00000000000..411962e8772 --- /dev/null +++ b/tests/baselines/reference/restTypeRetainsMappyness.types @@ -0,0 +1,24 @@ +=== tests/cases/compiler/restTypeRetainsMappyness.ts === +type Foo = { +>Foo : Foo + + [P in keyof T]: T[P] +} + +function test(fn: (...args: Foo) => void) { +>test : (fn: (...args: Foo) => void) => void +>fn : (...args: Foo) => void +>args : Foo + + const arr: Foo = {} as any +>arr : Foo +>{} as any : any +>{} : {} + + fn(...arr) // Error: Argument of type 'any[]' is not assignable to parameter of type 'Foo' +>fn(...arr) : void +>fn : (...args: Foo) => void +>...arr : any +>arr : Foo +} + diff --git a/tests/cases/compiler/restTypeRetainsMappyness.ts b/tests/cases/compiler/restTypeRetainsMappyness.ts new file mode 100644 index 00000000000..d0d4fff669c --- /dev/null +++ b/tests/cases/compiler/restTypeRetainsMappyness.ts @@ -0,0 +1,8 @@ +type Foo = { + [P in keyof T]: T[P] +} + +function test(fn: (...args: Foo) => void) { + const arr: Foo = {} as any + fn(...arr) // Error: Argument of type 'any[]' is not assignable to parameter of type 'Foo' +}