2017-10-19 101 views
0

我想定義一個函數,根據我給出的鍵值返回不同類型的對象。這基本上就像在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. 

這裏談到的問題,我已經有了在枚舉中定義的常量,我不喜歡使用字符串字面量,有沒有一種方法可以使這個工作?這意味着使用Kind枚舉的值作爲KindMap中的計算屬性鍵。

+2

[這是不支持](https://github.com/Microsoft/TypeScript/issues/16258)在當前版本的打字稿,看起來像[它可能會在2.7中修復](https://github.com/Microsoft/TypeScript/pull/15473) – artem

回答

0

有時keyof一個簡單的對象比打字稿枚舉簡單:

class Dog { } 
class Cat { } 

const kindMap = { 
    Dog, 
    Cat 
}; 

type KindMap = typeof kindMap; 

function getAnimalClass<K extends keyof KindMap>(key: K): KindMap[K] { 
    return kindMap[key]; 
} 

// These types are inferred correctly 
const DogClass = getAnimalClass('Dog'); 
const dog = new DogClass(); 

const CatClass = getAnimalClass('Cat'); 
const cat = new CatClass(); 

Try it in TypeScript Playground

我試圖執行getAnimal()與映射類型,但似乎碰到車的推論。但是,查看課程更容易。

內聯getAnimalClass查找還與類型推斷:

const dog = new kindMap['Dog']();