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 | N
是 unknown
,所以任何东西都是可分配的。但是如果 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?
})
我不知道是否可以用 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 | N
是 unknown
,所以任何东西都是可分配的。但是如果 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?
})