TypeScript - 如何使用预定义的可能值列表正确创建自己的类型?

时间:2015-04-15 09:01:55

标签: oop typescript

我希望我的Template.FOLDERS定义可能值的列表(例如enum,但带有字符串)。我希望能够引用这些可能的值来键入我的变量,因此如果我不使用其中一个可能的值,编译器会发出警告。

这是我到目前为止所做的,但我认为我弄错了:

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 个答案:

答案 0 :(得分:1)

使用枚举TemplateFolder

我建议使用帮助toFolderName enumerationconst 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中可以是静态的。