2017-08-21 2 views
1

Ich bin ziemlich neu in TypeScript, und ich habe versucht, einige Code neu zu gestalten.Typescript: einen Parameter oder eine Eigenschaft als einen der Schlüssel in einem bekannten Objekt deklarieren

Bedenken Ich habe ein Objekt als solche definiert:

const Operators = { 
    equal: '=', 
    not_equal: '!=', 
    less: '<', 
    less_or_equal: '<=', 
    greater: '>', 
    greater_or_equal: '>=', 
    contains: '~' 
}; 

Und dann habe ich eine Klasse definiert als solche:

class Query { 
    // I want to limit this to the keys defined in Operator 
    operator: string; 

    constructor(operator: string) { 
     this.operator = operator; 
    } 

    getOperatorValue: string { 
     return Operators[this.operator]; 
    } 
} 

Wie kann ich, dass der Parameter „Operator“ sein erzwingen ein die Schlüssel von Operators?

bekomme ich folgende Fehler gegen die Linie innerhalb getOperatorValue():

Error: TS7017:Element implicitly has an 'any' type because type '{ equal: string; not_equal: string; less: string; less_or_equal: string; greater: string; greater...' has no index signature. 

Das Typoskript 2.4.2 verwendet wird.

+0

Sie das Problem, indem Sie 'const Operatoren lösen könnte ' – jonrsharpe

Antwort

2

Sie könnten nach dem Operator, introduced in 2.1 und documented with index types suchen. Einfach, function foo<T>(bar: T, key: keyof T) stellen Sie sicher, dass key immer ein bekannter Schlüssel von T sein wird. Es bietet einen einfachen Weg zu type-safely use string indexers, neben anderen Anwendungen im Typsystem.

Die Dokumente zeigen Beispiele von keyOf mit einem typsichere Partial Klasse zu implementieren: {[key:: string]: string} = ...

type Readonly<T> = { 
    readonly [P in keyof T]: T[P]; 
} 
type Partial<T> = { 
    [P in keyof T]?: T[P]; 
} 
+3

Danke! Stellt sich heraus, ich brauchte das: 'operator: keyof typeof Operators;' weil ich 'Operatoren' definiert als ein 'const' nicht ein' type' – arthurakay

+0

Ich habe diese beiden vorher nie gemischt, aber es ist gut zu wissen, dass Sie und sie können funktionieren wie erwartet. :) – ssube

Verwandte Themen