jdo*_*dle 5 typescript typescript-generics
我想知道是否有一个简写可以在打字稿中为泛型类型仅指定一些可选类型。例如,如果我有一个带有可选类型的类:
class GenericClass<A extends Type1 = Type1, B extends Type2 = Type2, C extends Type3 = Type3>
Run Code Online (Sandbox Code Playgroud)
然后我想定义一个子类,例如:class Subclass extends GenericClass<TypeB> ,这将是 的简写class Subclass extends GenericClass<Type1, TypeB, Type3>,但它不起作用。相反,它尝试推断TypeB其子类型,Type1并给出错误。然而,在此示例中也允许省略Type3并让打字稿推断它。这样的东西对我定义通用反应组件很有用,我想在其中指定状态类型,而不是属性。
那么我是否正确,在指定可选类型时必须提供所有前面的可选类型。或者有什么办法可以像我正在尝试的那样吗?
对于可选函数参数,您可以只undefined为前面的可选参数指定,这对于泛型不起作用,但我确实尝试过,使用void而是,但这也不起作用。我也尝试过使用类似的语法Subclass extends GenericClass<B = TypeB>,但这也不起作用。
我看到了一些用接口替换可选函数参数的建议,例如:
interface Args { a?: number, b?: string, c?: any}
function myFunc(Args) {}
Run Code Online (Sandbox Code Playgroud)
然后可以将其称为 likemyFunc({b: "value"});并避免必须这样做myFunc(undefined, "value");。这感觉像是一个糟糕的选择,但也许可以对泛型类型做这样的事情?但我不确定那会是什么样子。
我尝试的另一件事是重载像type GenericClass<B extends Type2> = GenericClass<Type1, B, Type3>. 这不起作用,除非我用不同的名称输入它,例如GenericClassB
TypeScript 目前不具备您正在寻找的功能,至少从 TS5.1 开始是这样。 泛型类型参数只有在具有默认值的情况下才能被省略,并且不允许跳过任何默认值。有一些开放的功能请求,如果实现的话,可能会满足您的需求:
有microsoft/TypeScript#26242中要求的部分类型参数推断。该提案的一部分是允许使用“印记”或“占位符”类型,以便您可以编写类似或类似的内容。GenericClass<*, TypeB, *>GenericClass<_, TypeB, _>
还有microsoft/TypeScript#38913中要求的命名类型参数,您可以在其中编写,或者根据microsoft/TypeScript#54254中的要求,您可以编写类似或 之类的内容。GenericClass<B=TypeB>GenericClass<B: TypeB>GenericClass<{B: TypeB}>
最后,您提到的解决方法是使用单个类型参数,并将其限制为Args具有所有可选属性的类型,但 TypeScript 无法从索引访问类型推断;也就是说,它可以A从 type 的值推断A,但不能T extends {a: any}从 type 的值推断T["a"]。microsoft/TypeScript#51612有一个开放的功能请求可以做到这一点,但同样,它还不是该语言的一部分。
最近提到的两个问题中的一个或两个可能有希望得到解决。事实上,在microsoft/TypeScript#53017有一个 Pull request实现了最后一个,但我不知道它是否会被合并。( microsoft/TypeScript#20126上的一个更旧的拉取请求也实现了它,但它被放弃了。)
但在那之前您将需要使用解决方法。
| 归档时间: |
|
| 查看次数: |
1109 次 |
| 最近记录: |