为什么泛型函数中 `null` 被解释为 `any`?

问题描述 投票:0回答:1

为什么泛型函数中的

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

我怎样才能实现这个目标?

strojopis
1个回答
0
投票

经过进一步测试,在我创建了 TS Playground 后,尽管 Playground 和我的环境都使用相同的版本 5.7.2,我意识到这一定是本地配置问题

TS游乐场链接

我需要做的是启用

strictNullChecks

{
  "compilerOptions": {
    "strictNullChecks": true
  },
}
© www.soinside.com 2019 - 2024. All rights reserved.