例如,我在打字稿中有这种类型:
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 无法推断当
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;