首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >类型记录要求参数匹配第一个参数的类型签名。

类型记录要求参数匹配第一个参数的类型签名。
EN

Stack Overflow用户
提问于 2018-12-22 01:13:38
回答 1查看 454关注 0票数 2

我有一个类A,它有函数f (可能被子类覆盖)。

我想定义一个函数,g,这样g(cls, ...args)只能在clsA的子类并且args匹配cls.f的类型签名时才能工作。有办法这样做吗?

编辑:我修改了上面的内容,以反映g的第一个参数实际上是A子类的构造函数,而不是实例。

EN

Stack Overflow用户

回答已采纳

发布于 2018-12-22 01:22:57

当然,您可以使用休息/传播类型的元组实现这一点,因为TS3.0:

代码语言:javascript
运行
复制
declare class A {
  f(...args: any[]): any;
}
declare function g<T extends A>(val: T, ...args: Parameters<T['f']>): void;

declare class B extends A {
  f(x: string, y: number): boolean;
}
declare const b: B;
g(b, "hey", 123); // okay
g(b, 123, "hey"); // error

元组rest/spread推理隐藏在Parameters类型函数中,在标准库中定义为:

代码语言:javascript
运行
复制
type Parameters<T extends (...args: any[]) => any> = 
  T extends (...args: infer P) => any ? P : never;

这就是你要找的吗?

编辑:如果val应该是一个构造函数,那么您可以这样做:

代码语言:javascript
运行
复制
declare function g<T extends A>(
  val: new(...args:any[])=>T, 
  ...args: Parameters<T['f']>
): void;

declare class B extends A {
  f(x: string, y: number): boolean;
}
g(B, "hey", 123); // okay
g(B, 123, "hey"); // error

或者本质上是一样的:

代码语言:javascript
运行
复制
declare function g<T extends new (...args: any[]) => A>(
  val: T,
  ...args: Parameters<InstanceType<T>['f']>
): void;

取决于您希望T是构造函数类型还是实例类型。

票数 4
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53892341

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档