首页 > 解决方案 > 创建一个函数类型,该函数类型返回带有可能额外道具的参数对象

问题描述

我正在寻找一个函数flowLens,该函数采用具有特殊签名/类型的函数数组。

这是我的尝试:

type Plain = {[key: string]: any};
type SpecialFunction = <T extends Plain, R extends T & Plain>(props: T) => R;
    
function flowLens (...fns: SpecialFunction[]) {}

const invalidType = (props: { a: number }) => true;
const invalidNotArgs = (props: { a: number }) => ({ ducks: 1 });
const validOne = (props: { a: number }) => ({...props});
const validTwo = (props: { a: number }) => ({ ...props, b: 1 });

flowLens(invalidType)
flowLens(invalidNotArgs)
flowLens(validOne)
flowLens(validTwo)

操场

是否有可能做到这一点?如果有怎么办?

标签: typescripttypescript-generics

解决方案


对于调用时要验证的类型flowLens,您需要移动泛型以SpecialFunction直接进行参数化。以下应该有效:

type SpecialFunction<T extends Record<string, any>> = (props: T) => T;

function flowLens<T extends any[]>(...fns: {[K in keyof T]: SpecialFunction<T[K]>}) {}

默认情况下,TypeScript 允许无关的属性,因此您不需要任何额外的处理来允许返回类型上的那些。


推荐阅读