Uh oh!
There was an error while loading. Please reload this page.
- Notifications
You must be signed in to change notification settings - Fork 13.7k
Relax requirements on index signatures to 'any' when a type also contains a string index signature to 'any'#43065
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Uh oh!
There was an error while loading. Please reload this page.
Changes from all commits
File filter
Filter by extension
Conversations
Uh oh!
There was an error while loading. Please reload this page.
Jump to
Uh oh!
There was an error while loading. Please reload this page.
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,145 @@ | ||
| tests/cases/conformance/types/members/objectTypeWithStringAndNumberIndexSignatureToAny.ts(43,5): error TS2322: Type 'Obj' is not assignable to type 'NumberTo<any>'. | ||
| Index signature is missing in type 'Obj'. | ||
| tests/cases/conformance/types/members/objectTypeWithStringAndNumberIndexSignatureToAny.ts(49,5): error TS2739: Type 'StringTo<any>' is missing the following properties from type 'Obj': hello, world | ||
| tests/cases/conformance/types/members/objectTypeWithStringAndNumberIndexSignatureToAny.ts(50,5): error TS2739: Type 'NumberTo<any>' is missing the following properties from type 'Obj': hello, world | ||
| tests/cases/conformance/types/members/objectTypeWithStringAndNumberIndexSignatureToAny.ts(51,5): error TS2739: Type 'StringAndNumberTo<any>' is missing the following properties from type 'Obj': hello, world | ||
| tests/cases/conformance/types/members/objectTypeWithStringAndNumberIndexSignatureToAny.ts(61,5): error TS2322: Type 'Obj' is not assignable to type 'NumberTo<any>'. | ||
| tests/cases/conformance/types/members/objectTypeWithStringAndNumberIndexSignatureToAny.ts(65,5): error TS2322: Type 'Obj' is not assignable to type 'StringTo<any> & NumberTo<any>'. | ||
| Type 'Obj' is not assignable to type 'NumberTo<any>'. | ||
| Index signature is missing in type 'Obj'. | ||
| tests/cases/conformance/types/members/objectTypeWithStringAndNumberIndexSignatureToAny.ts(67,5): error TS2322: Type 'StringTo<any>' is not assignable to type 'Obj'. | ||
| tests/cases/conformance/types/members/objectTypeWithStringAndNumberIndexSignatureToAny.ts(68,5): error TS2322: Type 'NumberTo<any>' is not assignable to type 'Obj'. | ||
| tests/cases/conformance/types/members/objectTypeWithStringAndNumberIndexSignatureToAny.ts(69,5): error TS2739: Type 'StringTo<any> & NumberTo<any>' is missing the following properties from type 'Obj': hello, world | ||
| tests/cases/conformance/types/members/objectTypeWithStringAndNumberIndexSignatureToAny.ts(84,5): error TS2322: Type 'Obj' is not assignable to type 'NumberToNumber'. | ||
| Index signature is missing in type 'Obj'. | ||
| tests/cases/conformance/types/members/objectTypeWithStringAndNumberIndexSignatureToAny.ts(88,5): error TS2322: Type 'Obj' is not assignable to type 'StringToAnyNumberToNumber'. | ||
| Index signature is missing in type 'Obj'. | ||
| tests/cases/conformance/types/members/objectTypeWithStringAndNumberIndexSignatureToAny.ts(90,5): error TS2322: Type 'StringTo<any>' is not assignable to type 'Obj'. | ||
| tests/cases/conformance/types/members/objectTypeWithStringAndNumberIndexSignatureToAny.ts(91,5): error TS2739: Type 'NumberTo<number>' is missing the following properties from type 'Obj': hello, world | ||
| ==== tests/cases/conformance/types/members/objectTypeWithStringAndNumberIndexSignatureToAny.ts (13 errors) ==== | ||
| // When checking compatibility between two types, | ||
| // TypeScript should not require an index signature if | ||
| // the target side index signature maps to `any` *and* | ||
| // the target side has *any* string index signature to `any`. | ||
| // | ||
| // So an index signature like in | ||
| // | ||
| // { [x: number]: any } | ||
| // | ||
| // is still required of a source type, but neither index signature in | ||
| // | ||
| // { [x: number]: any, [x: string]: any; } | ||
| // | ||
| // should be required; *however*, the number index signature in | ||
| // | ||
| // { [x: number]: number, [x: string]: any; } | ||
| // | ||
| // should always be required. | ||
| interface StringTo<T> { | ||
| [x: string]: T; | ||
| } | ||
| interface NumberTo<T> { | ||
| [x: number]: T; | ||
| } | ||
| interface StringAndNumberTo<T> extends StringTo<T>, NumberTo<T> { | ||
| } | ||
| interface Obj { | ||
| hello: string; | ||
| world: number; | ||
| } | ||
| function f1(sToAny: StringTo<any>, nToAny: NumberTo<any>, bothToAny: StringAndNumberTo<any>, someObj: Obj) { | ||
| sToAny = nToAny; | ||
| sToAny = bothToAny; | ||
| sToAny = someObj; | ||
| nToAny = sToAny; | ||
| nToAny = bothToAny; | ||
| nToAny = someObj; | ||
| ~~~~~~ | ||
| !!! error TS2322: Type 'Obj' is not assignable to type 'NumberTo<any>'. | ||
| !!! error TS2322: Index signature is missing in type 'Obj'. | ||
| bothToAny = sToAny; | ||
| bothToAny = nToAny; | ||
| bothToAny = someObj; | ||
| someObj = sToAny; | ||
| ~~~~~~~ | ||
| !!! error TS2739: Type 'StringTo<any>' is missing the following properties from type 'Obj': hello, world | ||
| someObj = nToAny; | ||
| ~~~~~~~ | ||
| !!! error TS2739: Type 'NumberTo<any>' is missing the following properties from type 'Obj': hello, world | ||
| someObj = bothToAny; | ||
| ~~~~~~~ | ||
| !!! error TS2739: Type 'StringAndNumberTo<any>' is missing the following properties from type 'Obj': hello, world | ||
| } | ||
| function f2(sToAny: StringTo<any>, nToAny: NumberTo<any>, bothToAny: StringTo<any> & NumberTo<any>, someObj: Obj) { | ||
| sToAny = nToAny; | ||
| sToAny = bothToAny; | ||
| sToAny = someObj; | ||
| nToAny = sToAny; | ||
| nToAny = bothToAny; | ||
| nToAny = someObj; | ||
| ~~~~~~ | ||
| !!! error TS2322: Type 'Obj' is not assignable to type 'NumberTo<any>'. | ||
| bothToAny = sToAny; | ||
| bothToAny = nToAny; | ||
| bothToAny = someObj; | ||
| ~~~~~~~~~ | ||
| !!! error TS2322: Type 'Obj' is not assignable to type 'StringTo<any> & NumberTo<any>'. | ||
| !!! error TS2322: Type 'Obj' is not assignable to type 'NumberTo<any>'. | ||
| !!! error TS2322: Index signature is missing in type 'Obj'. | ||
Comment on lines
+97
to
+101
MemberAuthor There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This might be questionable. This used to work in 4.2, but this PR doesn't un-break this code. | ||
| someObj = sToAny; | ||
| ~~~~~~~ | ||
| !!! error TS2322: Type 'StringTo<any>' is not assignable to type 'Obj'. | ||
| someObj = nToAny; | ||
| ~~~~~~~ | ||
| !!! error TS2322: Type 'NumberTo<any>' is not assignable to type 'Obj'. | ||
| someObj = bothToAny; | ||
| ~~~~~~~ | ||
| !!! error TS2739: Type 'StringTo<any> & NumberTo<any>' is missing the following properties from type 'Obj': hello, world | ||
| } | ||
| type NumberToNumber = NumberTo<number>; | ||
| interface StringToAnyNumberToNumber extends StringTo<any>, NumberToNumber { | ||
| } | ||
| function f3(sToAny: StringTo<any>, nToNumber: NumberToNumber, strToAnyNumToNum: StringToAnyNumberToNumber, someObj: Obj) { | ||
| sToAny = nToNumber; | ||
| sToAny = strToAnyNumToNum; | ||
| sToAny = someObj; | ||
| nToNumber = sToAny; | ||
| nToNumber = strToAnyNumToNum; | ||
| nToNumber = someObj; | ||
| ~~~~~~~~~ | ||
| !!! error TS2322: Type 'Obj' is not assignable to type 'NumberToNumber'. | ||
| !!! error TS2322: Index signature is missing in type 'Obj'. | ||
| strToAnyNumToNum = sToAny; | ||
| strToAnyNumToNum = nToNumber; | ||
| strToAnyNumToNum = someObj; | ||
| ~~~~~~~~~~~~~~~~ | ||
| !!! error TS2322: Type 'Obj' is not assignable to type 'StringToAnyNumberToNumber'. | ||
| !!! error TS2322: Index signature is missing in type 'Obj'. | ||
| someObj = sToAny; | ||
| ~~~~~~~ | ||
| !!! error TS2322: Type 'StringTo<any>' is not assignable to type 'Obj'. | ||
| someObj = nToNumber; | ||
| ~~~~~~~ | ||
| !!! error TS2739: Type 'NumberTo<number>' is missing the following properties from type 'Obj': hello, world | ||
| someObj = someObj; | ||
| } | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,157 @@ | ||
| //// [objectTypeWithStringAndNumberIndexSignatureToAny.ts] | ||
| // When checking compatibility between two types, | ||
| // TypeScript should not require an index signature if | ||
| // the target side index signature maps to `any` *and* | ||
| // the target side has *any* string index signature to `any`. | ||
| // | ||
| // So an index signature like in | ||
| // | ||
| // { [x: number]: any } | ||
| // | ||
| // is still required of a source type, but neither index signature in | ||
| // | ||
| // { [x: number]: any, [x: string]: any; } | ||
| // | ||
| // should be required; *however*, the number index signature in | ||
| // | ||
| // { [x: number]: number, [x: string]: any; } | ||
| // | ||
| // should always be required. | ||
| interface StringTo<T> { | ||
| [x: string]: T; | ||
| } | ||
| interface NumberTo<T> { | ||
| [x: number]: T; | ||
| } | ||
| interface StringAndNumberTo<T> extends StringTo<T>, NumberTo<T> { | ||
| } | ||
| interface Obj { | ||
| hello: string; | ||
| world: number; | ||
| } | ||
| function f1(sToAny: StringTo<any>, nToAny: NumberTo<any>, bothToAny: StringAndNumberTo<any>, someObj: Obj) { | ||
| sToAny = nToAny; | ||
| sToAny = bothToAny; | ||
| sToAny = someObj; | ||
| nToAny = sToAny; | ||
| nToAny = bothToAny; | ||
| nToAny = someObj; | ||
| bothToAny = sToAny; | ||
| bothToAny = nToAny; | ||
| bothToAny = someObj; | ||
| someObj = sToAny; | ||
| someObj = nToAny; | ||
| someObj = bothToAny; | ||
| } | ||
| function f2(sToAny: StringTo<any>, nToAny: NumberTo<any>, bothToAny: StringTo<any> & NumberTo<any>, someObj: Obj) { | ||
| sToAny = nToAny; | ||
| sToAny = bothToAny; | ||
| sToAny = someObj; | ||
| nToAny = sToAny; | ||
| nToAny = bothToAny; | ||
| nToAny = someObj; | ||
| bothToAny = sToAny; | ||
| bothToAny = nToAny; | ||
| bothToAny = someObj; | ||
| someObj = sToAny; | ||
| someObj = nToAny; | ||
| someObj = bothToAny; | ||
| } | ||
| type NumberToNumber = NumberTo<number>; | ||
| interface StringToAnyNumberToNumber extends StringTo<any>, NumberToNumber { | ||
| } | ||
| function f3(sToAny: StringTo<any>, nToNumber: NumberToNumber, strToAnyNumToNum: StringToAnyNumberToNumber, someObj: Obj) { | ||
| sToAny = nToNumber; | ||
| sToAny = strToAnyNumToNum; | ||
| sToAny = someObj; | ||
| nToNumber = sToAny; | ||
| nToNumber = strToAnyNumToNum; | ||
| nToNumber = someObj; | ||
| strToAnyNumToNum = sToAny; | ||
| strToAnyNumToNum = nToNumber; | ||
| strToAnyNumToNum = someObj; | ||
| someObj = sToAny; | ||
| someObj = nToNumber; | ||
| someObj = someObj; | ||
| } | ||
| //// [objectTypeWithStringAndNumberIndexSignatureToAny.js] | ||
| "use strict"; | ||
| // When checking compatibility between two types, | ||
| // TypeScript should not require an index signature if | ||
| // the target side index signature maps to `any` *and* | ||
| // the target side has *any* string index signature to `any`. | ||
| // | ||
| // So an index signature like in | ||
| // | ||
| // { [x: number]: any } | ||
| // | ||
| // is still required of a source type, but neither index signature in | ||
| // | ||
| // { [x: number]: any, [x: string]: any; } | ||
| // | ||
| // should be required; *however*, the number index signature in | ||
| // | ||
| // { [x: number]: number, [x: string]: any; } | ||
| // | ||
| // should always be required. | ||
| function f1(sToAny, nToAny, bothToAny, someObj) { | ||
| sToAny = nToAny; | ||
| sToAny = bothToAny; | ||
| sToAny = someObj; | ||
| nToAny = sToAny; | ||
| nToAny = bothToAny; | ||
| nToAny = someObj; | ||
| bothToAny = sToAny; | ||
| bothToAny = nToAny; | ||
| bothToAny = someObj; | ||
| someObj = sToAny; | ||
| someObj = nToAny; | ||
| someObj = bothToAny; | ||
| } | ||
| function f2(sToAny, nToAny, bothToAny, someObj) { | ||
| sToAny = nToAny; | ||
| sToAny = bothToAny; | ||
| sToAny = someObj; | ||
| nToAny = sToAny; | ||
| nToAny = bothToAny; | ||
| nToAny = someObj; | ||
| bothToAny = sToAny; | ||
| bothToAny = nToAny; | ||
| bothToAny = someObj; | ||
| someObj = sToAny; | ||
| someObj = nToAny; | ||
| someObj = bothToAny; | ||
| } | ||
| function f3(sToAny, nToNumber, strToAnyNumToNum, someObj) { | ||
| sToAny = nToNumber; | ||
| sToAny = strToAnyNumToNum; | ||
| sToAny = someObj; | ||
| nToNumber = sToAny; | ||
| nToNumber = strToAnyNumToNum; | ||
| nToNumber = someObj; | ||
| strToAnyNumToNum = sToAny; | ||
| strToAnyNumToNum = nToNumber; | ||
| strToAnyNumToNum = someObj; | ||
| someObj = sToAny; | ||
| someObj = nToNumber; | ||
| someObj = someObj; | ||
| } |
Uh oh!
There was an error while loading. Please reload this page.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This is the example that's been un-broken.