文字类型,是否可以在运行时提取值列表

时间:2018-10-09 13:31:08

标签: typescript typing

还值得检查这个类似的问题(第一个更新的答案)Typescript derive union type from tuple/array values

type Direction = 'north' | 'east' | 'south' | 'west';

let direction:Direction = 'south';                      // OK

let xtern = JSON.parse(`{"dir":"wrong"}`);    // (from external source, needs validation

我想做的是在不重复可能值列表的情况下验证xtern.dir是否适合Direction类型,但是我认为无法提取文字类型的值列表,对吗?如果是这样,实现相同结果的简洁方法是什么?

1 个答案:

答案 0 :(得分:1)

如果您不介意牺牲一些编译时安全性,那么enum可以在这里工作:

enum Direction {
    North = "north",
    East = "east",
    South = "south",
    West = "west",
}

let direction1: Direction = Direction.South;      // This works
let direction2: Direction = Direction["south"];   // This also works!
let direction3: Direction = Direction["rubbish"]; // But this returns undefined  
                                                  // rather than a compiler error...

let xtern = JSON.parse(`{"dir":"wrong"}`); 
let isValidDir = Direction.hasOwnProperty(xtern.dir); // Can examine it at runtime

但是,如果您想像现在一样继续使用字符串文字联合,则当前唯一的选择是自己编写验证,并使其与类型定义保持同步。 the docs中演示了这种方法。