簡體   English   中英

類型的TypeScript聯合被解析為類型的交集

[英]TypeScript union of type is resolved as intersection of types

我有這個片段

class J {
  constructor(public foo: number) {}
}

class B {
 constructor(public bar: string) {}
}

interface Cache {
 json?: J;
 binary?: B;
}

function test(key: "json" | "binary", data: J | B, obj: Cache) {
  obj[key] = data;
}

如果您在https://www.typescriptlang.org/play/中嘗試此代碼,則obj[key] = data; 出現以下錯誤

類型'J | B”不可分配給“ J&B”類型。 類型“ J”不可分配給類型“ J&B”。 “ J”類型缺少屬性“ bar”,但在“ B”類型中必需。

顯然有一些我想念的東西,但我不知道是什么。 任何想法?

keydata之間沒有關系,因此您可以使用test( "json", new B())調用test,並且該分配無效。

如果您對鍵使用通用類型參數(稱為K ),並將data鍵入為Cache[K] ,則打字稿將允許分配。 (盡管它仍然不是100%安全的類型,因為K可能是一個聯合,並且可能發生上述相同的問題):

class J {
  constructor(public foo: number) {}
}

class B {
 constructor(public bar: string) {}
}

interface Cache {
 json?: J;
 binary?: B;
}

function test<K extends keyof Cache>(key: K, data: Cache[K], obj: Cache) {
  obj[key] = data;
}

Typescript不能告訴您您要更新Cache哪個屬性,並且在有疑問時,他認為您嘗試插入的值應該能夠同時適合兩者。 其中J | B can't. J | B can't.

您可以稍微更改test功能簽名以使用Partial

function test(update: Partial<Cache>, obj: Cache) {
    Object.assign(obj, update);
}

這樣,Typescript可以確保您傳遞的鍵/值對對於Cache類有效。

暫無
暫無

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

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