打字稿中的类型缩小基于类型中的枚举

问题描述 投票:0回答:1

例如,我在打字稿中有这种类型:

enum NumberOrStringType {
    NUMBER,
    STRING,
}

type NumberOrString = {
    dataType: NumberOrStringType,
    data: string | number;
};

以及后面的代码:

const numOrString: NumberOrString = { dataType: NumberOrStringType.NUMBER, data: 10 };

if (numOrString.dataType === NumberOrStringType.NUMBER) {
    const num: number = numOrString.data;
    ... 
} else {
    const str: string  numOrString.data;
    ...
}

不幸的是,我收到错误提示

type string | number is not assignable to type number
type string | number is not assignable to type string

我知道我可以分别使用

num
str
来投射
as number
as string
,但是有没有办法告诉打字稿通过枚举确定
data
的类型已被分配,或者通过使用 if 语句缩小类型?

typescript
1个回答
0
投票

你需要使用可区分联合:否则 Typescript 无法推断当

dataType
NumberOrStringType.NUMBER
data
始终为
number
,对于字符串反之亦然。

type NumberOrString = {
    dataType: NumberOrStringType.NUMBER;
    data: number;
} | {
    dataType: NumberOrStringType.STRING;
    data: string;
}

完成此操作后,您可以使用

satisfies
运算符来确保 TypeScript 检查您的对象是否满足类型,并且您的代码应该可以工作:

const numOrString = { dataType: NumberOrStringType.NUMBER, data: 10 } satisfies NumberOrString;

if (numOrString.dataType === NumberOrStringType.NUMBER) {
    const num = numOrString.data; 
} else {
    const str = numOrString.data;

请参阅此处的游乐场示例

© www.soinside.com 2019 - 2024. All rights reserved.