[英]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”類型中必需。
顯然有一些我想念的東西,但我不知道是什么。 任何想法?
key
和data
之間沒有關系,因此您可以使用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.