如何解决与较新版本相比,Typescript Exclude<> 在 3.8 和以前的版本中表现不同
我注意到与较新版本相比,在 3.8 版及之前的 Typescript 中使用 Exclude 时有所不同。
考虑以下示例:
interface Layer {
id: string;
}
export enum LayerType {
Text,Image,}
interface ImageLayer extends Layer {
src: string,layerType: LayerType.Image;
}
interface TextLayer extends Layer {
text: string,layerType: LayerType.Text;
}
type Layercombined = ImageLayer & TextLayer;
type IgnoredProperties = "layerType";
type WithoutLayerType = {
[key in Exclude<keyof Layercombined,IgnoredProperties>]: string;
};
const test: WithoutLayerType = {
id: "17",src: "test",text: "test",layerType: "type",};
将对象分配给 const test
会在 3.8 之前失败,并且 IMO 正确地抱怨 WithoutLayerType
上不存在 layerType,因为它被排除在外。在 3.9 和更新版本中,分配很好。
这对我来说感觉像是一个错误,但我确信这里面有一些我不明白的地方:)
也许有人可以启发我!
解决方法
问题的产生是因为 TypeScript 如何改变它对 intersection and optional properties in 3.9 的类型检查的处理。
在 3.9 之前,LayeredCombined 的类型结果将是所有属性的组合。 3.9以后,结果永远不会,因为layerType的类型冲突(一个是LayerType.Image,另一个是LayerType.Text).
因为 LayeredCombined 现在是 never 类型,keyof Layercombined 中的字符串文字类型不包含 ImageLayer 或TextLayer,因此不能排除任何内容。
最简单的解决方法是重新定义 Layercombined 如下:
type Layercombined = Partial<ImageLayer> & Partial<TextLayer>;
这将为您提供所有键,因为现在 layerType 将有一个可能的值,undefined。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。