2017-03-03 72 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");