gpt4 book ai didi

typescript - 类型联合不检查多余的属性

转载 作者:行者123 更新时间:2023-12-03 15:41:16 24 4
gpt4 key购买 nike

假设有一个对象具有ABC属性,例如:

const temp = {
A: 1,
B: 2,
}
或者
const temp = {
C: 3,
}
从直觉上来说,我认为这种类型是:
type T =  {A: number, B: number} | {C: number};

const valid: T = {A: 1, B: 2};
const alsoValid: T = {C: 3};

// Should complain but it does not
const invalid: T = {A: 1, B: 2, C: 3};
// Also should complain
const alsoInvalid: T = {A:1, C: 3};
但是TS将此类类型视为 {A?: number, B?: number, C?: number},基本上 |使字段成为可选字段,但是当我将 C属性添加到 AB中时,我希望TS提示类型不一致

如何归档所需的类型?

最佳答案

这对工会如何结合多余的属性(property)检查工作有一点古怪之处。 {A:1, C: 3}实际上与{C: number}兼容,除了多余的属性检查:

const o = {A:1, C: 3};
const ok: {C: number} = o; // No direct literal assignment, no excess property checks
const nok: {C: number} = { A:1, C: 3}; // Excess property checks kick in
Playground Link
多余属性检查的怪癖是,对于联合,它允许来自任何联合组成部分的任何属性都出现在分配的对象文字中。
如果并集构成要素彼此不兼容,则会出现错误:
type T =  {A: number, B: number} | {C: number, A?: undefined, B?: undefined };

const valid: T = {A: 1, B: 2};
const alsoValid: T = {C: 3};

// Error
const invalid: T = {A: 1, B: 2, C: 3};
//Error
const alsoInvalid: T = {A:1, C: 3};
Playground Link
如果工会成员很多,也可以使用 here中的 StrictUnion

type UnionKeys<T> = T extends T ? keyof T : never;
type StrictUnionHelper<T, TAll> = T extends any ? T & Partial<Record<Exclude<UnionKeys<TAll>, keyof T>, never>> : never;
type StrictUnion<T> = StrictUnionHelper<T, T>

type T = StrictUnion<{A: number, B: number} | {C: number }>;

const valid: T = {A: 1, B: 2};
const alsoValid: T = {C: 3};

// Error
const invalid: T = {A: 1, B: 2, C: 3};
//Error
const alsoInvalid: T = {A:1, C: 3};
Playground Link

关于typescript - 类型联合不检查多余的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65805600/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com