在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");
答案 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'