[英]How to tell typescript I'm passing object with a key of specific enum keys?
以下引發錯誤: Types of property 'type' are incompatible. Type 'MyEnum' is not assignable to type 'MyEnum.C | MyEnum.D'.
Types of property 'type' are incompatible. Type 'MyEnum' is not assignable to type 'MyEnum.C | MyEnum.D'.
我明白這意味着什么,但找不到好的解決方案。
enum MyEnum {
B,
C,
D,
}
interface MyInterface {
type: MyEnum
otherData: string
}
function func1(data: MyInterface): void {
if (
data.type === MyEnum.C ||
data.type === MyEnum.D
) {
func2(data) // throws an error
}
}
function func2(
data: Omit<MyInterface, 'type'> & {
type:
| MyEnum.C
| MyEnum.D
},
): void {}
如何判斷 typescript 我要處理鍵類型為MyEnum.C
或MyEnum.D
的數據?
您可以將條件更改為帶有檢查類型的返回類型的 function。 像這樣:
enum MyEnum {
A,B,C,D
}
interface MyInterface {
type: MyEnum;
}
interface OmittedInterface extends Omit<MyInterface, 'type'> {
type: MyEnum.C | MyEnum.D
}
function isOmittedInterface(data: MyInterface): data is OmittedInterface {
return data.type === MyEnum.C || data.type === MyEnum.D
}
function func1(data: MyInterface): void {
if (isOmittedInterface(data)) {
func2(data);
}
}
function func2(
data: Omit<MyInterface, 'type'> & {
type:
MyEnum.C
| MyEnum.D
},
): void {}
isOmittedInterface
的返回類型將使 typescript 在返回 true 時將類型視為 OmittedInterface
您可以將data
轉換為所需的類型:
enum MyEnum {
A, B, C, D
}
interface MyInterface {
type: MyEnum;
}
type MyInterfaceCD = Omit<MyInterface, 'type'> & {
type:
| MyEnum.C
| MyEnum.D
};
function func1(data: MyInterface): void {
if (
data.type === MyEnum.C ||
data.type === MyEnum.D
) {
func2(data as MyInterfaceCD) // throws an error
}
}
function func2(
data: Omit<MyInterface, 'type'> & {
type:
| MyEnum.C
| MyEnum.D
},
): void {}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.