簡體   English   中英

交集 '... &...' 被縮減為 'never' 因為屬性 '...' 在某些成分中具有沖突的類型

[英]The intersection '... & ...' was reduced to 'never' because property '...' has conflicting types in some constituents

我有兩個類定義如下:

class FirstClass {
  values: FirstValuesType = {} as FirstValuesType;

  setValues(values: FirstValuesType): void {
    this.values = { ...values };
  }
}

class SecondClass {
  values: SecondValuesType = {} as SecondValuesType;

  setValues(values: SecondValuesType): void {
    this.values = { ...values };
  }
}

interface CommonValuesType {
    id: number;
    property1: string;
    property2: string;
}

enum FirstReasonEnum {
    A, B, C
}

enum SecondReasonEnum {
    X, Y, Z
}

interface FirstValuesType extends CommonValuesType {
  reason: FirstReasonEnum;

}

interface SecondValuesType extends CommonValuesType {
  reason: SecondReasonEnum;
}

然后我定義了一個常量,它可以是以下類之一:

const model: FirstClass | SecondClass;

當我這樣調用setValues時:

model.setValues(newValues);

我收到以下 ts 錯誤:

  Argument of type '{ id: number; property1: string; property2: string; reason: FirstReasonEnum; }' is not assignable to parameter of type 'never'.
  The intersection 'FirstValuesType & SecondValuesType' was reduced to 'never' because property 'reason' has conflicting types in some constituents.(2345)

我該如何解決這個問題?

編輯:

這是游樂場的鏈接:

https://www.typescriptlang.org/play?ts=4.3.5#code/FDDGBsEMGdoAgGIEsBO0AuBhKs4G9g44A3ScAVwFNoAuRVDANTKugBUBPAB0rgF58AXzgx6adMwrVOPANwgi0ShJbUAFKSm0xTVe26UAlHWIB7JABN8hInHQALJNAB0m1v3xxn3t9TiD5IkFgYLAceABlSlBTADsLbBh4AiJfbSiY+MlWGV4BPGFRDLiLbOkDeRslFS0NPTpirL1c4xJzKxTbBydXPQ88Lx8+gJtg0KRY9EoUADNIUF5MUwBbZbiy-R5rWzhLOljyZYAjacDbLhRTHhR0DgBGOgwUCYBzM6ILq+nbgCZH9GesTeIRAlAOyx06AASpQYHEAKLg7a2ACCABo4AAhDGYEHAMGHOCNCwwuGxRGEzpEAAaGIAmhiAFp4iZTWbzXjIcQbXJwSgADym8XgS1W62aBmRKFh0DidC5GFJsvJ4Mq40m0zmCyJ0RKPMlAqFFhFKzWsX1W060rJDV18SVCNVeIgSTgAFkOIlcJ0QDYJkh0GoAPprCyUcDyhhYcJwAA+OsyCXChmRREyGDgofDkfEXvg8eJeY8IdMYfAlR26fQcFilAA7ht+jYdns7mjm+dLtdbg84AByT7d+599s7D5d74cP79weTn4jjtEa3KnOKmWOw7OdEd4JjzOl8POaobNS1ht6QzvfwgQRAA

您的代碼假定modelFirstClass的實例,但類型表明它可能是FirstClass的實例,也可能是SecondClass的實例。 由於不清楚它是哪個,但setValues需要知道,TypeScript 向您強調您傳遞的參數無效(或者我應該說可能無效)。 不可能是有效的,因為它不能同時是FirstValuesTypeSecondValuesType (這是FirstValuesType & SecondValuesType的意思),因為reason的類型不同。

解決它的最小更改方法是測試你必須查看它是否是FirstClass實例,你可以這樣做,因為你已經使用了 class (不僅僅是接口)。 所以這修復了它:

if (model instanceof FirstClass) {
    model.setValues(newValues);
} else {
    // ...code here to do something with the `SecondClass` `model`
}

游樂場示例


也就是說,您可能想重新考慮整體結構,但這實際上取決於具體情況,這看起來像是一個簡化的示例(適當簡化,以便提出問題)。 FirstClassSecondClass以及FirstValuesTypeSecondValuesType除了用於reason的枚舉類型之外是相同的。 您可能會考慮在單個TheClassValuesType上使用泛型類型參數。 但這不會改變基本問題,即init中的代碼假設 model 是一回事,而它可能是兩件事中的一個或另一個。


旁注:這部分init代碼似乎有點可疑:

const model: TheClass<EnumType> = _model;
// ...
model.setValues(newValues);

model常量和_model參數指向相同的 object ,因此不創建不必要的附加標識符並直接使用_model會更直接:

_model.setValues(newValues);

無論哪種方式,您都在修改傳入的 object。(如果您打算復制object,則需要執行復制操作。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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