我不知道是否可以用TS来实现。
Here是一个游乐场,可能更好理解。
我有一个默认的类型组
type DefaultTypes = 'group1' | 'group2'
和接口组
interface Group<N> {
type: DefaultTypes | N
label: string
}
以及用于注册组的函数
function registerGroups <T>(group: Group<T>) {}
这样,我可以向DefaultTypes中添加更多类型组,但是如果我在不使用泛型类型的情况下调用registerGroups({})
,TS不会将错误返回到其他组类型。
有办法使它起作用吗?
Thx
答案 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
,并且unknown
是unknown | N
,那么任何东西都是可分配的。但是,如果unknown
默认为T
,则会得到never
,它简化为never | N
,因此只有类型为N
的值才可以分配`:
N