为何函数泛型中null被解析为any?如何实现预期类型推导?
问题原因与解决方案
为什么传null时泛型被解析成any?
出现这个问题的根源是TypeScript默认关闭了strictNullChecks配置项。在该模式下,null和undefined会被视为any类型的子集,导致你传入null时,泛型Initial被直接推导为any,而非预期的null。
首先得在tsconfig.json里开启严格空值检查,这是解决类型推导混乱的基础:
{ "compilerOptions": { "strictNullChecks": true // 其他配置项... } }
实现你要的类型效果
开启严格检查后,用条件类型直接定义返回值类型就行,比你之前的默认泛型参数写法更直接准确:
function useToggle<Initial extends boolean | null>(initialState: Initial): Initial extends null ? boolean | null : boolean { // 以React Hooks为例的实现逻辑 const [state, setState] = React.useState(initialState); const toggle = () => { setState(prev => prev === null ? true : !prev); }; // 类型断言确保TS识别返回值符合条件类型要求 return state as ReturnType<typeof useToggle<Initial>>; }
测试结果
现在调用函数的类型推导完全符合你的预期:
useToggle(true); // useToggle<true>(initialState: true): boolean useToggle(false); // useToggle<false>(initialState: false): boolean useToggle(null); // useToggle<null>(initialState: null): boolean | null
如果不想区分true/false的字面量类型,希望统一推导成boolean,也不用改代码——TypeScript会自动把字面量类型拓宽为boolean,返回类型依然是boolean。
内容的提问来源于stack exchange,提问作者Qwerty
相关产品推荐
相关产品推荐

