gpt4 book ai didi

javascript - 在接口(interface)上定义索引类型的选择

转载 作者:行者123 更新时间:2023-12-03 00:10:29 25 4
gpt4 key购买 nike

假设我有一个动物界面,我希望它具有一些通用属性,然后是猫或狗并具有相应的属性。

interface Dog {
dog: { sound: string; }
}

interface Cat {
cat: { lives: number; }
}

type CatOrDog = Cat | Dog;

interface Animal {
weight: number;
// index type of CatOrDog
}

所以我在想

interface Animal {
weight: number;
[K in keyof CatOrDog]: CatOrDog[K];
}

但是当我使用 [K:string]: type 以外的任何内容时,TypeScript 会非常生气

我想要实现的是

// Success
const dog = <Animal> {
weight: 5,
dog: {sound: "woof" }
}

// Error, lives doesn't exist on Dog
const errorAnimal = <Animal> {
weight: 5,
dog: {sound: "woof" },
cat: { lives: 9 }
}

另外,如果我想添加更多索引类型,可以吗?

最佳答案

Cat | 这样的联盟狗inclusive ,意味着某物是Cat |狗(如果它是两者)。 TypeScript 没有通用的 exclusive union运算符(operator)。如果您的联合共享具有不同值的公共(public)属性,则可以使用@MateuszKocz 建议的可区分联合。否则,您可以build your own对象的 Xor 类型函数:

type ProhibitKeys<K extends keyof any> = { [P in K]?: never }

type Xor<T, U> = (T & ProhibitKeys<Exclude<keyof U, keyof T>>) |
(U & ProhibitKeys<Exclude<keyof T, keyof U>>);

那么你可以将Animal定义为CatDog的独占并集,intersected具有所有Animal共有的附加属性:

type Animal = Xor<Cat, Dog> & { weight: number };

现在您可以获得所需的行为(类型注释优于类型断言,因此我在这里使用它们):

// Success
const dog: Animal = {
weight: 5,
dog: { sound: "woof" }
}

// Error, {lives: number} not assignable to undefined
const errorAnimal: Animal = {
weight: 5,
dog: { sound: "woof" },
cat: { lives: 9 }
}

希望有帮助;祝你好运!

关于javascript - 在接口(interface)上定义索引类型的选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54753845/

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