typescript - 类型的 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”中需要。
显然我缺少一些东西,但我不知道是什么。任何想法?
解决方案
key
和之间没有关系data
,因此您可以调用 testtest( "json", new B())
并且分配无效。
如果您使用泛型类型参数(让我们称之为)作为K
键和类型,打字稿将允许分配。(即使它仍然不是 100% 类型安全的,因为它可能是一个联合,并且可能会发生与上述相同的问题):data
Cache[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;
}
推荐阅读
- java - Google Cloud Endpoints 错误原因:java.lang.IllegalArgumentException:预期的原始类,但得到了
- javascript - 根据其他表单字段填写选择选项输入
- jenkins - 如何将下游参数(例如当前构建参数)传递给 Jenkins 的下游作业。如何为此编写脚本管道?
- zsh - 在 zsh 中完成命令名称本身
- authentication - 无需身份验证即可显示数据
- r - 对列向量进行逐行操作
- javascript - 在 JavaScript 中,使用 `a == null` 实际上等同于 `a === null || 一个 === 未定义`?
- azure-devops - 在 Azure DevOps 中检查任务的状态
- java - 名称为 [DEFAULT] 的 FirebaseApp 不存在。(对于春季启动)
- wpf - 未从 Command 收到 MVVM Light messenger 消息