我有这个片段
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/ https://www.typescriptlang.org/play/, 线obj[key] = data;
有以下错误
类型 'J | B' 不可分配给类型“J & B”。
类型“J”不可分配给类型“J & B”。
属性“bar”在类型“J”中缺失,但在类型“B”中必需。
显然我缺少一些东西,但我不知道是什么。任何想法?
之间没有关系key
and data
,所以你可以调用测试test( "json", new B())
并且该分配将无效。
如果您使用泛型类型参数(我们称其为K
) 用于键和类型data
as 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;
}
Play https://www.typescriptlang.org/play/#code/MYGwhgzhAEBS0G8BQ1rAPYDsIBcBOArsDungBQAOBARiAJbDQBm66AXNJgQLbUCmeAJSIAvkjFJQkGACFEKDNnxES5KrQbRqYPB1x46mAObCEYiYZwCmYYH2gBhWwAt7yaACsIWAPwdYANwo1IY6AJ5+0DJBEkwEmMR0WNBWuAA8ANLQfAAeVpgAJjAA1nxh6EyOLnwAfGSlYRwZADTQBWA4YBxOwK4A2hkAuq3o1B7d1aYo0KMefQ2D0AC8bR1gMUA
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)