ค้นหาเว็บไซต์

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

บทความที่เกี่ยวข้อง