関数を定義して、私が与えるキーに基づいてオブジェクトの異なる型を返すようにしたい。それは、私が代わりに入力した文字列の列挙型を使用する代わりに、文字列リテラルの、基本的にcreateElement
機能がTypeScriptインターフェイスの文字列列挙値を計算されたプロパティキーとして使用
https://github.com/Microsoft/TypeScript/blob/master/lib/lib.dom.d.ts#L3117
にここで使用トリックのようなものです。だから私はこの
class Dog {}
class Cat {}
class Bird {}
enum Kind {
Dog = 'Dog',
Cat = 'Cat',
Bird = 'Bird'
}
interface KindMap {
[Kind.Dog]: Dog
[Kind.Cat]: Cat
[Kind.Bird]: Bird
}
function getAnimal<K extends keyof KindMap> (key: K): KindMap[K] {
switch (key) {
case Kind.Dog:
return new Dog()
case Kind.Cat:
return new Cat()
case Kind.Bird:
return new Bird()
}
}
のようなものを書いたしかし、活字体は、ここで質問が来て、私は計算されたプロパティとしてインターフェイス内enum Kind
の価値を置く方法が好きではない、それは
A computed property name in an interface must directly refer to a built-in symbol.
を不平を言うようです、私はすでに列挙型で定義された定数を持っている、私は文字列リテラルを使用するのが好きではない、私はこれを動作させることができる方法はありますか?つまり、KindMap
の計算されたプロパティキーとしてKind列挙値を使用します。
現在typescriptですバージョンで(https://github.com/Microsoft/TypeScript/issues/16258)[これはサポートされていません]、のように見えます[2.7で修正されるかもしれません](https://github.com/Microsoft/TypeScript/pull/15473) – artem