gpt4 book ai didi

TypeScript:根据另一个字段查找字段的类型

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

假设我有一个这样的界面:

interface Cat {
weight: number;
name: string;
adoptable: boolean;
}

我想定义以下接口(interface),可用于在 Cat 上设置值:
interface CatUpdate {
field: keyof Cat;
value: ???
}

我希望 TypeScript 强制该值是基于字段的适当类型。例如,这应该是无效的:
const x: CatUpdate = {
field: "name",
value: 12
}

如何定义 CatUpdate.value 的类型?

最佳答案

我的倾向是制作 CatUpdate联合类型而不是接口(interface),如下所示:

interface Cat {
weight: number;
name: string;
adoptable: boolean;
}

type PropUpdate<T extends object> = {
[K in keyof T]: { field: K; value: T[K] }
}[keyof T];


type CatUpdate = PropUpdate<Cat>;
/*
type CatUpdate = {
field: "weight";
value: number;
} | {
field: "name";
value: string;
} | {
field: "adoptable";
value: boolean;
}
*/

这在您提到的用例上应该足够好:
const x: CatUpdate = {
field: "name",
value: 12
} // error!

如果需要,您应该能够组合这些( CatUpdate | DogUpdate ),尽管没有特定的用例很难知道这样的组合是否合适(可以 CatDog 相互区分吗?那是, Cat & Dog 是不可能的吗?如果 Cat & Dog 是可能的,那么 CatUpdate | DogUpdate 只能用于更新 Cat & Dog。如果不可能,那么 CatUpdate | DogUpdate 可能应该被替换为有区别的联合,而不是像 (CatUpdate & {kind: "CatUpdate"}) | (DogUpdate & {kind: "DogUpdate"}) .)

希望有帮助;祝你好运!

Link to code

关于TypeScript:根据另一个字段查找字段的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57386913/

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