Dont' return 泛型类型如果未定义

Dont' return generic type if is undefined

我不知道是否可以用 TS 实现这个。

Here是一个游乐场,可以更好地理解。


我有一个默认类型组

type DefaultTypes = 'group1' | 'group2'

还有一个接口组

interface Group<N> {
  type: DefaultTypes | N
  label: string
}

以及注册群组的函数

function registerGroups <T>(group: Group<T>) {}

这样我可以向 DefaultTypes 添加更多类型组,但是如果我调用 registerGroups({}) 没有泛型类型,TS 不会 return 错误到不同的组类型。

有没有办法让它起作用?

感谢

Typescript 从您传入的参数推断类型参数。在这种情况下,如果您不指定类型参数,编译器将根据您分配给 type 的值来推断它,所以对于这个例子:

registerGroups({
  label: 'Group 4',
  type: 'group4' // How make TS return an error here?
})

T 推断为 group4。这是设计的行为,也是它应该工作的方式。最好的泛型函数是那种不需要你显式传入类型参数的函数。

没有禁用推理的内置方法,有一些变通方法,基于这样的想法,我们可以通过使用一些条件类型来混淆编译器,使其在某个参数位置放弃推理。来自 jcalz 的 This is solution 是我通常在这种情况下使用的那个。将此与 T 的默认值 never 配对,您将获得预期的行为。默认值是必需的,因为如果 TS 没有地方可以从中推断出 T,它默认为 unknown,而 unknown | Nunknown,所以任何东西都是可分配的。但是如果 T 默认为 never 我们得到 never | N 这简化为 N 所以只有类型 N 的值是可赋值的`:

type NoInfer<T> = [T][T extends any ? 0 : never];
function registerGroups <T = never>(group: Group<NoInfer<T>>) {}

// group4 is not in Types, but no error
registerGroups({
  label: 'Group 4',
  type: 'group4' // How make TS return an error here?
})

Playground Link