具有功能的映射接口到其他返回类型,保留了呼叫签名

时间:2019-01-06 21:45:30

标签: typescript

我有一个像这样的界面:

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
 }

我希望我很清楚:)

1 个答案:

答案 0 :(得分:0)

使用条件类型

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

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

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