首页 > 解决方案 > 有条件的需要打字稿

问题描述

所以我有一个有两个参数的函数

第一个参数是选择变体名称,它是必需的,第二个参数是首选项,如果首选项有未定义的类型我想要的是它应该只填充第一个参数,不需要在第二个参数中输入 undefined

在此处输入图像描述

这是我的代码

type VariantTypes = {
  Apple: {
    amount: number
  },
  Air: undefined
}

function Spawn<variant extends keyof VariantTypes>(variant: variant, prefs: VariantTypes[variant]) {

}

Spawn('Apple', {
  amount: 7
})

Spawn('Air') // Second parameter has undefined type, it should not warn me an error if I fill only the first params
Spawn('Air', undefined) // I have to do this, but this is not what I want when second param has undefined type

标签: typescripttypes

解决方案


你可以使用可变元组类型条件类型来创建一个简单的辅助类型:

type Args<T, K extends keyof T = keyof T> = K extends unknown 
    ? T[K] extends undefined 
        ? [K] 
        : [K, T[K]] 
    : never
type VariantTypesArgs = Args<VariantTypes> // ["Apple", { amount: number }] | ["Air"]

然后你只需要用这种类型输入你的函数参数:

declare function Spawn(...args: [...Args<VariantTypes>]): void

游乐场链接


推荐阅读