如果未定义,则不返回通用类型

时间:2020-05-08 04:05:42

标签: typescript generic-type-argument

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

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


我有一个默认的类型组

type DefaultTypes = 'group1' | 'group2'

和接口组

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

以及用于注册组的函数

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

这样,我可以向DefaultTypes中添加更多类型组,但是如果我在不使用泛型类型的情况下调用registerGroups({}),TS不会将错误返回到其他组类型。

有办法使它起作用吗?

Thx

1 个答案:

答案 0 :(得分:3)

Typescript从您传入的参数中推断类型参数。在这种情况下,如果您不指定类型参数,则编译器将根据您分配给type的值来推断它,因此对于此示例:< / p>

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

T被推断为group4。这是设计的行为,这是它应该起作用的方式。最好的通用函数类型是不需要您显式传递类型参数的类型。

没有禁用推论的内置方法,有一些变通办法,基于这样的想法,我们可以使用某些条件类型使编译器在某个参数站点上放弃推论。我经常在这种情况下使用jcalz的This is solution。将其与T的{​​{1}}的默认值配对,您将获得预期的行为。需要使用默认值,因为如果TS无处可从中推断出never的默认值为T,并且unknownunknown | N,那么任何东西都是可分配的。但是,如果unknown默认为T,则会得到never,它简化为never | N,因此只有类型为N的值才可以分配`:

N

Playground Link

相关问题