TypeScript:基于参数的条件返回函数自动补全问题
解决TypeScript条件分支返回类型不匹配问题
问题核心在于泛型T与参数options的绑定逻辑错误:当前参数类型是联合类型options,而非泛型T,导致TypeScript无法在条件分支中缩小T的具体范围,因此要求返回值必须满足returnFunctions[T]所有可能类型的交集(同时包含两个函数),与你的预期不符。
以下是两种可行解决方案:
方案一:修正泛型参数绑定
将参数options的类型改为T,让泛型与传入的具体参数值绑定,再通过类型断言明确当前分支的返回类型:
type options = "bar" | "foo"; interface barFunctions { barFunction: () => void; } interface fooFunctions { fooFunction: () => void; } interface returnFunctions { bar: barFunctions, foo: fooFunctions } const example = <T extends options>(options: T): returnFunctions[T] => { if (options === "bar") { return { barFunction() { console.log("It's the bar function"); } } as returnFunctions[T]; } if (options === "foo") { return { fooFunction() { console.log("It's the foo function"); } } as returnFunctions[T]; } throw new Error(`Expected either foo or bar but got ${options}`); }; // 自动补全测试 const barResult = example("bar"); barResult.barFunction(); // 正常提示barFunction const fooResult = example("foo"); fooResult.fooFunction(); // 正常提示fooFunction
方案二:使用函数重载
通过重载签名明确每个参数对应的返回类型,实现部分无需额外断言,逻辑更直观:
type options = "bar" | "foo"; interface barFunctions { barFunction: () => void; } interface fooFunctions { fooFunction: () => void; } // 重载签名:定义参数与返回值的对应关系 function example(options: "bar"): barFunctions; function example(options: "foo"): fooFunctions; // 实现签名:处理核心逻辑 function example(options: options) { if (options === "bar") { return { barFunction() { console.log("It's the bar function"); } }; } if (options === "foo") { return { fooFunction() { console.log("It's the foo function"); } }; } throw new Error(`Expected either foo or bar but got ${options}`); } // 自动补全测试 const barResult = example("bar"); barResult.barFunction(); // 正常提示barFunction const fooResult = example("foo"); fooResult.fooFunction(); // 正常提示fooFunction
内容的提问来源于stack exchange,提问作者Daniel V.
相关产品推荐
相关产品推荐

