定义TypeScript对象类型,其中属性类型取决于另一个类型literal的值

lnxxn5zx  于 2023-02-05  发布在  TypeScript
关注(0)|答案(2)|浏览(178)

请检查以下示例:

type MyLiterals = 'a' | 'b'

type MyObject<T extends MyLiterals> = {
    a: T,
    b: T extends 'a' ? number : string
}

// thit works
let obj2: MyObject<'b'> = {
    a: 'b',
    b: ''
}

// Generic type 'MyObject' requires 1 type argument(s)
let obj1: MyObject = {
    a: 'b',
    b: ''
}

有没有一种方法可以实现我在第二个示例中尝试做的事情,即泛型的值是由分配给第一个属性的值推断出来的?

wtzytmuj

wtzytmuj1#

或者,您可以创建所有可能对的并集。
这里我利用了分布式条件类型来实现这一点:

type MyObjectFactory<T extends MyLiterals> = T extends any ? {
    a: T,
    b: T extends 'a' ? number : string
} : never

type MyObject = MyObjectFactory<MyLiterals>

运动场
换句话说:

type MyObject = MyLiterals extends infer T ? T extends any ? {
    a: T,
    b: T extends 'a' ? number : string
} : never : never
8xiog9wr

8xiog9wr2#

有函数可以吗?

function setIt<T extends MyLiterals>(a:T, b : T extends 'a' ? number : string) : MyObject<T>{
    return {a,b}
}

let obj1;

obj1 = setIt('a',12); // OK
obj1 = setIt('b',12); // Do not compile

相关问题