无论是为了使用default,还是为了让编译器推断类型参数,目前还没有这样的语法来"跳过"generic类型参数.在microsoft/TypeScript#26242中有一个长期开放的特性请求;如果实现了这一点,那么您可能能够编写Foo<number, , number>
或Foo<number, *, number>
,或者Foo<number, infer, number>
或其他东西.
在此之前,您只需将该类型写为Foo<number, string, number>
,或者以某种方式解决它.
如果"跳过"的目的是获取缺省值,一种可能的解决方法是创建一个表示"跳过"的自定义类型,并重写类型以识别这一点.例如:
interface $ { ___SIGIL___: true; } // $ means "skip"
type Default<T, U> = [T] extends [$] ? U : T;
现在你会写type MyF<T = $, U = $, V = $> = F<Default<T, X>, Default<U, Y>, Default<V, Z>>
,而不是type F<T = X, U = Y, V = Z>
.对于你的Foo
,S看起来像:
type FooT1Default = Foo<any> extends Foo<any, infer T1, any> ? T1 : never;
// type FooT1Default = string
type FooT2Default = Foo<any> extends Foo<any, any, infer T2> ? T2 : never;
// type FooT2Default = boolan
type MyFoo<T, T1=$, T2=$> =
Foo<T, Default<T1, FooT1Default>, Default<T2, FooT2Default>>;
我们可以测试它:
type Example = MyFoo<number, $, number>
// type Example = Foo<number, string, number>
const data: MyFoo<number, $, number> = {
ID: 1,
Name: "apache", // okay
IsActive: 1,
}
Playground link to code个