Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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) {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Seems like this isn't the right fix - you'll still end up with the wrong error span, just as in the following example:

class Foo {
  [p: string]: any;
  static [p: string]: number;
}
error: Property 'prototype' of type 'Foo' is not assignable to string index type 'number'.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I've opened up #44134 to track that.

// `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]