2017-02-10 7 views
2

Index Signaturen in Typoskript zu vertreten ist, so definiert:Typoskript - Wie ein Index Signatur als generischer Typ

Wörterbuch

[key: string]: T 

Array

[index: number]: T 

Diese in einige einfachen gewickelt werden könnte , wiederverwendbare Typen:

type DictionaryIndex<T> = { 
    [key: string]: T 
} 

type ArrayIndex<T> = { 
    [index: number]: T 
} 

Jetzt möchte ich diese in einen einzigen Typ umhüllen. Ich versuchte dies:

type Index<TKey extends string|number, TValue> = { 
    [key: TKey]: TValue 
} 

Dies kompiliert nicht aufgrund der folgenden Fehler:

An index signature parameter must be of type 'string' or 'number'.

Ist dies nicht möglich?

Was zur Hölle?

Da

foo(obj: Index<string, Bar>) 
foo(obj: Index<string, Bar> & Fooable<string>) 

sieht ordentlicher als

foo(obj: { [key: string]: Bar }) 
foo(obj: { [key: string]: Bar, canFoo: (foo: string) => Bar }) 
+0

Es gibt ein Problem mit dem TypeScript-Repo darüber: https://github.com/Microsoft/TypeScript/issues/13398 Raten Sie, es ist noch nicht möglich. –

Antwort

2

kühle Frage!
Ich denke der Grund ist, dass dies wirklich ein Randfall für den Compiler ist, der wahrscheinlich nicht implementiert wurde, weil es die Mühe nicht wert ist.

Indexeigenschaftsschlüssel können nur Zahlen sein, die offensichtlich sind, und Objekteigenschaftsschlüssel können nur Zeichenfolgen oder Zahlen sein. Am Ende gibt Ihre Einschränkung also nur an, was tatsächlich eine Tatsache ist und was der Compiler in einem speziellen Fall behandeln müsste.
Also noch einmal gehe ich davon aus, dass St. Anders diese Bemühungen ditched ;-)

aber, warum dies nicht tun

type StrIndex<TValue> = { 
    [key: string]: TValue 
} 

type NumIndex<TValue> = { 
    [key: number]: TValue 
} 

foo(obj: StrIndex<Bar>) 
foo(obj: StrIndex<Bar> & Fooable<string>) 

es als Ihre Lösung nicht so sauber ist, aber als Kompromiss scheint es, als die Menge speziell OK von XXXIndex-Typen ist begrenzt auf 2

Verwandte Themen