首页 > 解决方案 > 类型的 TypeScript 联合被解析为类型的交集

问题描述

我有这个片段

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”中需要。

显然我缺少一些东西,但我不知道是什么。任何想法?

标签: typescripttypescript3.0union-types

解决方案


key和之间没有关系data,因此您可以调用 testtest( "json", new B())并且分配无效。

如果您使用泛型类型参数(让我们称之为)作为K键和类型,打字稿将允许分配。(即使它仍然不是 100% 类型安全的,因为它可能是一个联合,并且可能会发生与上述相同的问题):dataCache[K]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;
}


推荐阅读