TypeScript动态设置函数参数可选性的问题与修正
动态设置函数参数可选性的问题与解决
需求与初始实现
需求是基于此前指定的泛型参数类型,动态设置当前函数的参数可选性,最初尝试通过参数组与元组来实现,代码如下:
interface Options<I> { init?: I, getInit?: () => I } function fun1 <P>(par: P) { function fun2 <I, O extends P extends boolean ? [options: Options<I>] : [options?: Options<I>]>(...arg: O) { return { p: '' as P, i: '' as I } } return fun2 }
存在的问题
实际调用时会出现两个异常:
- 泛型
I始终被推断为unknown init的类型与getInit的返回值类型无法形成相互约束,推测是第一个问题引发的连锁反应
调用示例:
const { p, i } = fun1(true)({ init: "1", getInit: () => "1" })
实验性修正方案
通过调整泛型使用逻辑,引入泛型O捕获实际输入内容,修正后的代码可正确推断类型,目前暂不确定是否存在副作用,代码如下:
function fun1<P>(par: P) { function fun2<I, O extends Options<I>>( ...arg: P extends boolean ? [options: Options<I> & O] : [options?: Options<I> & O] ) { return { p: '' as P, i: '' as I, g: '' as unknown as O extends { getInit: () => any } ? true : false } } return fun2 } const { p, i, g } = fun1(true)({ init: "1", getInit: () => "1" }) // p 类型为 boolean // i 类型为 string // g 类型为 true
内容的提问来源于stack exchange,提问作者beginner
相关产品推荐
相关产品推荐

