将字符串文字类型转换为文字值

时间:2016-11-07 10:34:15

标签: string typescript

在TypeScript中,我们可以使用字符串文字类型来执行以下操作:

type HelloString = "Hello";

这让我可以按如下方式定义字符串枚举:

namespace Literals {
    export type One = "one";
    export type Two = "two";
}

然后我可以定义一个联盟:

type Literal = Literals.One | Literals.Two;

有没有办法将Literals.One的唯一值提取为类型Literals.One

原因在于,当我定义这样的函数时:

function doSomething(literal : Literal) {

}

我真的很想做以下事情:

doSomething(Literals.One);

但我不能。我必须写:

doSomething("one");

2 个答案:

答案 0 :(得分:5)

您可以在命名空间中包含具有相同名称的类型和值,因此您可以为这些值定义常量:

namespace Literals {
    export type One = "one";
    export type Two = "two";
    export const One: One = "one";
    export const Two: Two = "two";
}

const s: Literals.One = Literals.One;
console.log(s);

有一个probosal on github for string enums,他们建议当前最好的解决方案就是上面的例子。

答案 1 :(得分:2)

使用自定义变换器(https://github.com/Microsoft/TypeScript/pull/13940)可以将字符串文字类型转换为文字值,这可以在typescript @ next中找到。

请查看我的npm包ts-transformer-enumerate

使用示例:

// The signature of `enumerate` here is `function enumerate<T extends string>(): { [K in T]: K };`
import { enumerate } from 'ts-transformer-enumerate';

type Colors = 'green' | 'yellow' | 'red';
const Colors = enumerate<Colors>();

console.log(Colors.green); // 'green'
console.log(Colors.yellow); // 'yellow'
console.log(Colors.red); // 'red'