string - 将字符串缩小为字符串文字联合

标签 string typescript types literals unions

我想将字符串缩小为字符串文字联合。换句话说,我想检查字符串是否是我的文字联合的可能值之一,以便这将起作用(如果运算符 couldbe 存在)。

type lit = "A" | "B" | "C";
let uni: lit;
let str = "B";
if(str couldbe lit){
    uni = str;
} else {
    doSomething(str);
}

我怎样才能做到这一点?

我尝试使用 if (str instanceof lit) ,但这似乎不起作用。使用 keyof迭代字符串联合也不起作用,因为允许的值本身不是键。

一种方法是使用 switch每个可能的值都有一个案例,但如果 lit 可能会导致细微的错误s 允许值更改。

最佳答案

您可以使用 User-Defined Type Guards .

type lit = "A" | "B" | "C";
let uni: lit;
let str = "B";

function isLit(str: string): str is lit {
    return str == "A" || str == "B" || str == "C";
}
function doSomething(str: string) {

}

if (isLit(str)) {
    uni = str;
}
else {
    doSomething(str);
}

地址:

为避免重复编辑,class可用于编译时和运行时。现在您只需编辑一处即可。
class Lit {
    constructor(public A = 0, public B = 0, public C = 0) {}
}
type lit = keyof Lit;
let uni: lit;

function isLit(str: string): str is lit {
    let lit = new Lit();
    return (str in lit) ? true : false;
}

关于string - 将字符串缩小为字符串文字联合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44004643/

相关文章:

typescript - Angular 2 和模板 : Unterminated string literal. 在第 6 列 24

types - 什么是 Isabelle/HOL 亚型?哪些 Isar 命令产生子类型?

Java - 当返回类型对自己的方法参数类型使用泛型时覆盖扩展接口(interface)的返回类型

C:退出函数时丢失字符串

java - 将字符串拆分为多行

reactjs - TS 'Object possibly null'错误如何解决?

typescript - VSCode 无法识别子目录中的类型

在处理反转字符串的函数时进行 Coredump

C函数输入字符串并计算

types - 通用 Lisp : How to check if something is a type specifier?