2017-03-03 63 views
0

我经常会一个字符串这样对象实例从字符串字面打字稿

type stringNumbers = 'One' | 'Two' | 'Three'; 

并使用它在类的构造函数

class myClass { 
    display: stringNumbers; 
    constructor(display: stringNumbers) { 
     this.display = display; 
    } 
} 

我的问题是,当我创建一个新类。我的价值是我想要它的类型,但我必须输入一个字符串来显示。

let newMyClass = new MyClass('Two'); 

这是对简单的物体,vscode会告诉我可以用什么类型,但没有任何智能感知,而当你有什么更先进的变得非常混乱。

我想有一个名为一样的字符串文字枚举或物体的属性和它的值是这样

enum nums = { 
    One, 
    Two, 
    Three 
} 

let nums = { 
    One: 'One'; 
    Two: 'Two'; 
    Three: 'Three'; 
} 

这样的字符串值当我提出一个新的类,我可以做到这一点

let newMyClass = new MyClass(nums.One); 

如何使这些类中的任何意见声明更好?我喜欢字符串字面类型,但它们变得几乎没有用,只是将它设置为复杂对象上的字符串类型。在我的用例中,我想将表单字段绑定到模型上的某个属性,但这是一个字段的其他选项的中间,所以工具提示非常混乱。

回答

2

如果你想使用,然后枚举:如果您想使用枚举

enum nums { 
    One, 
    Two, 
    Three 
} 

class myClass { 
    display: nums; 

    constructor(display: nums) { 
     this.display = display; 
    } 
} 

new myClass(nums.One); 

,但希望有字符串值(名称),而不是再序:

class myClass { 
    display: string; 

    constructor(display: nums) { 
     this.display = display[display]; 
    } 
} 

如果要使用该对象并将密钥作为字符串传递:

let nums = { 
    One: 'One', 
    Two: 'Two', 
    Three: 'Three' 
} 

type keys = keyof typeof nums; 

class myClass { 
    display: string; 

    constructor(display: keys) { 
     this.display = nums[display]; 
    } 
} 

new myClass("One");