生成构建器函数类型接口的 Typescript 泛型

Typescript generic that generates an interface of builder function types

给定一个 Typescript 接口:

interface Product {
  url: URL;
  available: boolean;
  price: number;
}

我想创建一个通用类型,给定一个接口可以输出一个构建器类型:

interface ProductSteps {
  url: (data: unknown) => URL;
  available: (data: unknown) => boolean;
  price: (data: unknown) => number;
}

我尝试使用 Record 实用程序类型来生成生成器:

type Steps<T> = Record<keyof T, (data: unknown) => T[keyof T]>
type ProductSteps = Steps<Product>;

这工作正常,但它导致允许 Product 的任何值类型作为 return 类型:

type ProductSteps {
  url: (data: unknown) => URL | boolean | number;
  available: (data: unknown) => URL | boolean | number;
  price: (data: unknown) => URL | boolean | number;
}

关于如何将构建器函数的 return 类型限制为它们在 Product 中的相应类型有什么想法吗?

我们想创建一个基于两个通用值的 mapped type:一个 ObjectType,如 Product 和一个 DataType,代表我们正在映射的数据。对于对象类型 ([P in keyof ObjectType]) 的每个键,对应的值类型是一个函数,它获取数据并将其映射到该键 ((data: DataType) => ObjectType[P]) 的对象值。

type Steps<ObjectType, DataType> = {
  [P in keyof ObjectType]: (data: DataType) => ObjectType[P]
};

用你的 Product 和任意的 SomeDataInterface 调用这个:

type Test = Steps<Product, SomeDataInterface>;

解析为:

type Test = {
    url: (data: SomeDataInterface) => URL;
    available: (data: SomeDataInterface) => boolean;
    price: (data: SomeDataInterface) => number;
}

Typescript Playground Link