我试图绕过一些可选的泛型类型参数,并将其保留为已定义的默认值.

这是一个示例脚本:

interface Foo<T, T1 = string, T2 = boolean> {
    ID: T
    Name: T1
    IsActive: T2
}

有3个类型参数如下:

  • T--这是必须的
  • T1--可选,默认为string
  • T2--可选,默认为boolean

我想创建data个,规格如下:

  • T--number
  • T1--&lt;默认为string&gt;
  • T2--number
const data:Foo<number, ..., number> = {
    ID: 1,
    Name: "apache", // the name type should be a string
    IsActive: 1,
}

推荐答案

无论是为了使用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

Typescript相关问答推荐

泛型和数组:为什么我最终使用了`泛型T []`而不是`泛型T []`?<><>

返回同时具有固定键和变量键的对象的函数的返回类型

TypeScrip表示该类型不可赋值

TypeScrip:逐个 case Select 退出noUncheck kedIndexedAccess

在对象中将缺省值设置为空值

在Typescript 中,有没有`index=unfined的速记?未定义:某个数组[索引]`?

在类型脚本中创建泛型类型以动态追加属性后缀

如何编写在返回函数上分配了属性的类型安全泛型闭包

使用动态输出类型和泛型可重用接口提取对象属性

类型脚本中参数为`T`和`t|unfined`的重载函数

如何使函数参数数组不相交?

如何在Reaction Native中关注屏幕时正确更新状态变量?

在TS泛型和记录类型映射方面有问题

如何从抽象类的静态方法创建子类的实例?

映射类型不是数组类型

如何在TypeScript类成员函数中使用筛选后的keyof this?

在类型{}上找不到带有string类型参数的索引签名 - TypeScript

Angular另一个组件的nativeelement未定义

如何为字符串模板文字创建类型保护

通用可选函数参数返回类型