javascript - การจำกัดประเภทของคุณสมบัติในวัตถุใน TypeScript อย่างไดนามิกตามคุณสมบัติอื่น
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 ตาม field โดยใช้ Typescript ดังที่กล่าวไว้ด้านล่างหรือไม่?
const adultCriteria: Criteria<User> = {
field: "age",
operator: ">",
value: 18
}
คำตอบ #1
ครับ/ค่ะ มันเป็นไปได้:
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
