为什么泛型函数中的
null
被解释为any
?
以最简单的形式,这就是问题所在,其中
null
导致 any
通用。
function useToggle<Initial>(initialState: Initial) { }
useToggle(true) // useToggled<boolean>(initialState: boolean): void
useToggle(false) // useToggled<boolean>(initialState: boolean): void
useToggle(null) // useToggled<any>(initialState: any): void
这最终就是我需要的形式。
基本上,当使用
useToggle(null)
初始化 null
时,它将返回 null
作为其第一个值,之后它将在 true
| 之间切换。 false
,但是,我无法使用 boolean | null
输入返回类型,这会导致代码不安全。
function useToggle<Initial extends boolean | null, R = Initial extends null ? boolean | null : boolean>(initialState: Initial): R { return }
useToggle(true) // useToggler<true, boolean>(initialState: true): boolean
useToggle(false) // useToggler<false, boolean>(initialState: false): boolean
useToggle(null) // useToggler<any, boolean>(initialState: any): boolean <- wrong (unexpected)
我所期望和需要的是这样的:
useToggle(null) // useToggle<null, boolean | null>(initialState: null): boolean | null
我怎样才能实现这个目标?
经过进一步测试,在我创建了 TS Playground 后,尽管 Playground 和我的环境都使用相同的版本 5.7.2,我意识到这一定是本地配置问题
我需要做的是启用
strictNullChecks
。
{
"compilerOptions": {
"strictNullChecks": true
},
}