TS中的Literal Types能获取其取值范围吗?

type A = "a";
type N = 1 | 2 | 3;
var a = ... A ; // 获取A的取值之一"a"
var n = 4;
if(n {{isIlegalOf}} N) // 判断n是否是N的合法值
    ...
阅读 2.4k
1 个回答

因为 TS 编译成普通的 JS 后你这些啥 type 的就都没有了,所以要想在运行时验证一个外部输入是否是一个合法的字面值,只能“曲线救国”:

const NArray = [1, 2, 3] as const; // 用数组来存储字面值
type N = typeof NArray[number]; // N 依旧是 1 | 2 | 3,编译时该用 N 的地方正常用

var n = 4;
if (NArray.includes(n as any)) { // 运行时转为判断是否在数组中
    // Do Something
}

注:需 TypeScript 3.4 或更高版本。