我有一个方法produce
,其签名如下:
interface ProduceConditions {
[key: string]: Function|Promise<any>;
}
produce(conditions: ProduceConditions, input: any): Promise<object>|object;
问题是返回的(已解析的)对象与conditions
对象具有相同的键。
编辑:我应该添加对函数源的引用,该函数位于https://github.com/selfrefactor/rambdax/blob/master/modules/produce.js
答案 0 :(得分:7)
如果我理解您正确询问的内容,那么您的输入conditions
将是ProduceConditions
的实现,其中包含一些键和返回值(无论是否包含在承诺中) )将具有相同的键,但所有值都已解析。
在这种情况下,您正在寻找的签名将是:
produce<T extends ProduceConditions, U extends { [key in keyof T]: any }>(conditions: T, input: any): Promise<U> | U
这里我使用了两种泛型类型来表示输入和输出,要求输入类型T
符合ProduceConditions
的定义和输出类型{{1} }具有与U
相同的键。
答案 1 :(得分:1)
如果输入应该是一个值为函数或promise的对象,并且输出是一个带有这些函数的对象,那么你可以使用mapped types和inference from mapped types来指定约束:
type ProduceConditionsMapper<T> = {
[K in keyof T]: ((input: T[K]) => void) | Promise<T[K]>;
}
declare function produce<T>(conditions: ProduceConditionsMapper<T>, input: any): T;
行动中:
declare const func: (x: number) => void;
declare const prom: Promise<string>;
const produceConditions = {
cat: func,
dog: prom
}
const ret = produce(produceConditions, 'hmm');
// inferred as {cat: number; dog: string;}
我不确定input
与其他类型之间的关系是什么,但您可能会给它一个比any
更具体的类型,以获得更好的结果。无论如何,希望有所帮助。