diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 576c055762f..fad22675cbe 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -36898,6 +36898,11 @@ namespace ts { const someBaseTypeHasBothIndexers = forEach(getBaseTypes(type), base => getIndexTypeOfType(base, IndexKind.String) && getIndexTypeOfType(base, IndexKind.Number)); errorNode = someBaseTypeHasBothIndexers || !type.symbol.declarations ? undefined : type.symbol.declarations[0]; } + if (!errorNode) { + // `getIndexDeclarationOfSymbol` does not return the declarations for static index signatures, since they + // come from the __index symbol in the `exports` table of the symbol, and not the `members` table + errorNode = getIndexInfoOfType(type, IndexKind.Number)?.declaration || getIndexInfoOfType(type, IndexKind.String)?.declaration; + } } if (errorNode && !isTypeAssignableTo(numberIndexType!, stringIndexType!)) { // TODO: GH#18217 diff --git a/tests/baselines/reference/staticIndexSignature3.errors.txt b/tests/baselines/reference/staticIndexSignature3.errors.txt new file mode 100644 index 00000000000..4b57e0ab00d --- /dev/null +++ b/tests/baselines/reference/staticIndexSignature3.errors.txt @@ -0,0 +1,33 @@ +tests/cases/conformance/classes/staticIndexSignature/staticIndexSignature3.ts(12,5): error TS2413: Numeric index type '1' is not assignable to string index type 'boolean'. + + +==== tests/cases/conformance/classes/staticIndexSignature/staticIndexSignature3.ts (1 errors) ==== + class B { + static readonly [s: string]: number; + static readonly [s: number]: 42 | 233 + } + + class D extends B { + static readonly [s: string]: number + } + + class ED extends D { + static readonly [s: string]: boolean + static readonly [s: number]: 1 + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +!!! error TS2413: Numeric index type '1' is not assignable to string index type 'boolean'. + } + + class DD extends D { + static readonly [s: string]: 421 + } + + const a = B["f"]; + const b = B[42]; + const c = D["f"] + const d = D[42] + const e = ED["f"] + const f = ED[42] + const g = DD["f"] + const h = DD[42] + \ No newline at end of file