微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

与较新版本相比,Typescript Exclude<> 在 3.8 和以前的版本中表现不同

如何解决与较新版本相比,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 举报,一经查实,本站将立刻删除。