gpt4 book ai didi

typescript - 匹配 Typescript 中可能的类型文字

转载 作者:搜寻专家 更新时间:2023-10-30 20:59:46 26 4
gpt4 key购买 nike

以下面的最小示例为例:

type BinaryOp = 'MOV'
type UnaryOp = 'ADD' | 'SUB' | 'JRO'
const BinaryOps: BinaryOp[] = ['MOV']
const UnaryOps: UnaryOp[] = ['ADD', 'SUB', 'JRO']

type Line =
{ op: BinaryOp, a: number, b: number }
| { op: UnaryOp, a: number }

以及下面的“模式匹配”:

switch (line.op) {
case 'ADD':
case 'SUB':
case 'JRO':
return `${line.op} ${line.a}`
case 'MOV':
return `${line.op} ${line.a}, ${line.b}`
}

我不是特别喜欢这样,为了让 case 理解操作是 UnaryOp 还是 BinaryOp,我必须列举所有的可能性。是否有一种紧凑(呃)的方式来实现这一目标?

注意。考虑到这是一个简化的示例,可能还有其他类型的Op

最佳答案

我不认为有任何 TypeScript 技巧可以用来避免必须枚举所有 case 标签,因为标签必须是值而不是类型。

但是,您可以使用 if 语句代替 switch,并且可以使用 user-defined type guardsif 表达式中。

用户定义的类型保护是一个返回类型为类型谓词的函数。例如,UnaryOp 的用户定义类型保护可能如下所示:

function isUnaryOp(op: string): op is UnaryOp {
return op && UnaryOps.includes(op as any);
}

if 语句中使用时,用户定义的类型保护将缩小类型:

if (isUnaryOp(line.op)) {
const op = line.op; // Inferred to be UnaryOp
} else if (isBinaryOp(line.op)) {
const op = line.op; // Inferred to be BinaryOp
} else {
const op = line.op; // Inferred to be never
}

关于typescript - 匹配 Typescript 中可能的类型文字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50779186/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com