" | " = { field: P, value: T[P], operator: MatchOperator, -6ren">
gpt4 book ai didi

javascript - 根据其他属性动态限制 TypeScript 中对象属性的类型

转载 作者:行者123 更新时间:2023-12-01 15:39:57 24 4
gpt4 key购买 nike

type MatchOperator = "==" | ">" | "<";

type Criteria<T, P extends keyof T> = {
field: P,
value: T[P],
operator: MatchOperator,
}

interface User {
name: string;
age: number;
id: number;
}

const adultCriteria: Criteria<User, "age"> = {
field: "age",
operator: ">",
value: 18
}

有没有更好的方法来限制 value 的类型,使用 Typescript 如下所述?

const adultCriteria: Criteria<User> = {
field: "age",
operator: ">",
value: 18
}

最佳答案

是的,这是可能的:

type Criteria<T> = {
[P in keyof T]: {
field: P,
value: T[P],
operator: MatchOperator
}
}[keyof T]

通过这种方式,您可以获得 3 种可能类型的联合类型组合:

type OnePossibleCriteria = Criteria<User>

type OnePossibleCriteria = {
field: "name";
value: string;
operator: MatchOperator;
} | {
field: "age";
value: number;
operator: MatchOperator;
} | {
field: "id";
value: number;
operator: MatchOperator;
}

当您为其分配固定值时,它会缩小到其中之一。

const adultCriteria: OnePossibleCriteria = {
field: "age",
value: 18,
operator: ">"
}

TypeScript Playground

关于javascript - 根据其他属性动态限制 TypeScript 中对象属性的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61476095/

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