Skip to content

Commit

Permalink
Ensure static index signatures have an errorNode available
Browse files Browse the repository at this point in the history
  • Loading branch information
weswigham committed May 17, 2021
1 parent 9eab334 commit 7a9854c
Show file tree
Hide file tree
Showing 2 changed files with 38 additions and 0 deletions.
5 changes: 5 additions & 0 deletions src/compiler/checker.ts
Original file line number Diff line number Diff line change
Expand Up @@ -36898,6 +36898,11 @@ namespace ts {
const someBaseTypeHasBothIndexers = forEach(getBaseTypes(<InterfaceType>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
Expand Down
33 changes: 33 additions & 0 deletions tests/baselines/reference/staticIndexSignature3.errors.txt
Original file line number Diff line number Diff line change
@@ -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]

0 comments on commit 7a9854c

Please sign in to comment.