簡體   English   中英

如何告訴 typescript 我正在使用特定枚舉鍵的鍵傳遞 object?

[英]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.CMyEnum.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM