首页 > 解决方案 > 将函数映射到不同的返回类型的接口,保留调用签名

问题描述

我有一个这样的界面:

interface Foo {
  foo(a: string, b:number): string | number;
  bar(a: boolean): number;
}

我需要一个映射类型,在成员上具有相同的调用签名和不同的返回类型。像这样的东西:

// this is not a real type
interface_like_this "FooBoolean"
  foo(a: string, b: number): boolean
  bar(a: boolean): boolean;

必须是这样的,保留调用签名并更改返回类型

type ToBoolean<T> = { [...]: boolean }; 

我会这样使用:

const fooBar: ToBoolean<Foo> = {
  foo(a: string, b: number){ return true }, // type check OK
  bar(a: number) { return false } // type check FAIL, wrong 'a' parameter type
 }

我希望我很清楚:)

标签: typescript

解决方案


使用条件类型

type ToBoolean<T> = {
  [K in keyof T]: T[K] extends (...args: any[]) => any
    ? (...args: Parameters<T[K]>) => boolean
    : never;
}; 

它需要ParametersTypeScript >= 3.1 中可用的类型。如果您使用的是旧版本,您可以自己创建它:

type Parameters<T extends (...args: any[]) => any> =
  T extends (...args: infer P) => any
    ? P
    : never;

推荐阅读