使用 const 创建字符串文字类型

Creating String Literal Type with const

我正在尝试使用一组 const 将新类型定义为 String Literal。显然 TypeScript 不喜欢这个想法。我究竟做错了什么? 这是一个重现错误的简单案例。

module Colors {

    export const Red = '#F00';
    export const Green = '#0F0';
    export const Blue = '#00F';

    export type RGB = Colors.Red | Colors.Green | Colors.Blue; // Error!
}

var c: Colors.RGB = Colors.Green;

错误信息是

Module 'Colors' has no exported member 'Red'.

new type as String Literal using a set of const

您不能将 const 用作类型注释。它们在不同的声明空间https://basarat.gitbooks.io/typescript/content/docs/project/declarationspaces.html

修复

module Colors {

    export const Red = '#F00';
    export const Green = '#0F0';
    export const Blue = '#00F';

    export type RGB = '#F00' | '#0F0' | '#00F';
}

这可能是一个合理的妥协:

module Colors {

    export type RGB = '#F00' | '#0F0' | '#00F';

    export const Red: RGB = '#F00';
    export const Green: RGB = '#0F0';
    export const Blue: RGB = '#00F';

}

这样,每次需要 Colors.RGB 类型时,我都可以使用其中一个常量。以下代码现在有效:

function foo( color: Colors.RGB) {
    //...
}

foo(Colors.Red);