microsoft / microsoft/TypeScript
Error in Index Signature Assignment
Nessuno ha ancora preso questa issue.
- Lingua principale
- Go
- Stelle
- 111k
- Fork
- 14.4k
- Merge medio
- 1g 19h
- PR unite (30g)
- 117
Descrizione
🔎 Search Terms
"index signature error", "numeric index incompatible with interface", "index signature assignment error", "object literal known properties error", "interface index signature bug", "interface property compatibility error"
🕗 Version & Regression Information
- This is the behavior in every version I tried, and I reviewed the FAQ for entries about index signatures
⏯ Playground Link
💻 Code
/* case 1 */
interface ITopType {
tKey: string;
}
interface ISubType extends ITopType {
sKey: string;
}
interface ITestInteface {
[pA: string]: ITopType;
[pB: number]: ISubType;
}
const testObj: ITestInteface = {
a: { tKey: "tVal" },
1: { tKey: "tVal", sKey: "sVal" }
// ^ here's the error
};
// --- --- ---
/* case 2 */
interface ITopType_2 {
tKey_2: string;
}
interface ISubType_2 extends ITopType_2 {
sKey_2: string;
}
interface ITestInteface_2 {
[pA_2: string]: ITopType_2;
[pB_2: `sub_${string}`]: ISubType_2;
}
const testObj_2: ITestInteface_2 = {
a: { tKey_2: "tVal_2 " },
sub_b: { tKey_2: "tVal_2 ", sKey_2: "sVal_2" }
// ^ here's the error
};
🙁 Actual behavior
The TypeScript handbook states that it is possible to support both types (string and number) of indexers, but the type returned from a numeric indexer must be a subtype of the type returned from the string indexer. However, when attempting to implement this, I encountered an error.
/* case 1 */
interface ITopType {
tKey: string;
}
interface ISubType extends ITopType {
sKey: string;
}
interface ITestInteface {
[pA: string]: ITopType;
[pB: number]: ISubType;
}
const testObj: ITestInteface = {
a: { tKey: "tVal" },
1: { tKey: "tVal", sKey: "sVal" }
// ^ here's the error
};
The error:
Type '{ a: { tKey: string; }; 1: { tKey: string; sKey: string; }; }' is not assignable to type 'ITestInteface'.
Property '1' is incompatible with index signature.
Object literal may only specify known properties, and 'sKey' does not exist in type 'ITopType'.(2322)
There are several approaches to rectify this error (type assertion etc.), but they involve rewriting code and modifying constructs.
The same issue can occur here even without the use of a number index signature.
/* case 2 */
interface ITopType_2 {
tKey_2: string;
}
interface ISubType_2 extends ITopType_2 {
sKey_2: string;
}
interface ITestInteface_2 {
[pA_2: string]: ITopType_2;
[pB_2: `sub_${string}`]: ISubType_2;
}
const testObj_2: ITestInteface_2 = {
a: { tKey_2: "tVal_2 " },
sub_b: { tKey_2: "tVal_2 ", sKey_2: "sVal_2" }
// ^ here's the error
};
The second error:
Type '{ a: { tKey_2: string; }; sub_b: { tKey_2: string; sKey_2: string; }; }' is not assignable to type 'ITestInteface_2'.
Property 'sub_b' is incompatible with index signature.
Object literal may only specify known properties, but 'sKey_2' does not exist in type 'ITopType_2'. Did you mean to write 'tKey_2'?(2322)
🙂 Expected behavior
The TypeScript compiler should allow assignment to the number index signature and the template string pattern index signature.
Additional information about the issue
No response
Guida per i contributori
Apri la guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Direzione di ricerca
Inizia con gli esempi collegati di TypeScript Playground e riproduci entrambi gli errori di assegnazione. Poi traccia la gestione da parte del compilatore dei controlli delle proprietà in eccesso dei literal di oggetto per le firme di indice numeriche e con template string. Il lavoro è completo quando le assegnazioni previste vengono accettate senza indebolire i controlli non correlati delle firme di indice e viene aggiunta la copertura di regressione per entrambi i casi.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Valutazione
- Stack tecnologico
- typescript
- Ambito
- compilers
- Tipo di issue
- Bug
- Difficoltà
- 4/5
- Tempo stimato
- 3-5 giorni
- Stato di attività
- Ferma
- Chiarezza
- Abbastanza chiara
- Idoneità per principianti
- 25/100