生成构建器函数类型接口的 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 接口:
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;
}