2015-04-15 15 views
0

我想我的Template.FOLDERS定義一個可能的值列表(如enum,但與字符串)。我希望能夠引用這些可能的值來鍵入我的變量,所以如果我不使用其中一個可能的值,編譯器會發出警告。TypeScript - 如何使用預定義的可能值列表正確創建我們自己的類型?

這是我到目前爲止已經完成,但我想我聽錯了:

export class Template { 
    public static FOLDERS: TemplateFolders = { 
     CONTAINERS: 'containers', 
     LAYOUTS: 'layouts', 
     PARTIALS: 'partials', 
     PAYMENT_METHODS: 'paymentMethods', 
     MAIN: 'main' 
    }; 
} 

export interface TemplateFolders { 
    CONTAINERS: string; 
    LAYOUTS: string; 
    PARTIALS: string; 
    PAYMENT_METHODS: string; 
    MAIN: string; 
} 

然後,在另一個類我用這個:

protected TEMPLATE_FOLDER: string = Template.FOLDERS.MAIN; 

但是,這不是我想要做的,我想輸入TEMPLATE_FOLDER,這樣我只能設置其中一個預定義的值。

如何在TypeScript中實現這一目標?

回答

1

隨着枚舉TemplateFolder

我建議一個enumeration或用輔助toFolderName一個const enum

export const enum TemplateFolder { 
    Containers, Layouts, Partials, PaymentMethods, Main 
} 

var toFolderName = (function() { 
    var names = ['containers', 'layouts', 'partials', 'paymentMethods', 'main']; 
    return function (tf: TemplateFolder): string { 
     return names[tf]; 
    }; 
})(); 

console.log(toFolderName(TemplateFolder.PaymentMethods)); // paymentMethods 

隨着類TemplateFolder

class TemplateFolder { 
    constructor(private name: string) { 
    } 
    public toString(): string { 
     return this.name; 
    } 
} 

var templateFolders = { 
    CONTAINERS: new TemplateFolder('containers'), 
    LAYOUTS: new TemplateFolder('layouts'), 
    PARTIALS: new TemplateFolder('partials'), 
    PAYMENT_METHODS: new TemplateFolder('paymentMethods'), 
    MAIN: new TemplateFolder('main') 
}; 

console.log(templateFolders.PAYMENT_METHODS); // paymentMethods 

當然,可變templateFolders可以是靜態類Template

+0

我沒有使用'enum',因爲我找不到一種方法來爲它們設置一個值,例如:'enum Folders {CONTAINERS:'containers'}',我需要設置一個值。 – Vadorequest

+0

我建議在需要文件夾名稱時使用一個函數。 – Paleo

+0

這看起來更像是一種解決方法,我寧願使用適當的東西。另一種可能是重寫'TemplateFolder.toString()'函數來自動調用'toFolderName'函數,這只是一個想法。不知道它會工作,但想知道是否沒有更好的方法。 – Vadorequest

相關問題