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
}
我希望我很清楚:)
解决方案
使用条件类型:
type ToBoolean<T> = {
[K in keyof T]: T[K] extends (...args: any[]) => any
? (...args: Parameters<T[K]>) => boolean
: never;
};
它需要Parameters
TypeScript >= 3.1 中可用的类型。如果您使用的是旧版本,您可以自己创建它:
type Parameters<T extends (...args: any[]) => any> =
T extends (...args: infer P) => any
? P
: never;
推荐阅读
- selenium - Selenium IDE - 将文件上传到字段中
- react-native - ImageBackground 不会出现
- python - 什么框架支持带有基本文本和多边形的简单全屏(即没有可见的镶边)应用程序?
- pyspark - 什么是 LabeledPoint RDD?如何在其中打印数据?
- java - 在为@PathParam 发送带有Url 中数据的反斜杠时,它将作为正斜杠
- javascript - 错误:无法调用 React.createContext,因为对象类型中缺少属性 createContext
- corda - 无法在 Corda 中启动流程 - java.lang.IllegalStateException:这只能在流程启动后完成
- c++ - 用 std::chrono 显示日、月和年?
- python - 如何使用 Python 找出两个数据框在列名方面的差异
- r - R:提取大列表中的字符长度