gpt4 book ai didi

typescript - 将数组参数类型映射到数组返回类型?

转载 作者:行者123 更新时间:2023-12-02 15:52:20 24 4
gpt4 key购买 nike

我有一个枚举来描述“字段”,以及每个字段到类型的映射:

enum Field {
Id,
Position,
Name,
Enabled,
}

interface FieldTypes extends Record<Field, any> {
[Field.Id]: number;
[Field.Position]: number;
[Field.Name]: string;
[Field.Enabled]: boolean;
}

我写了一个函数来从一些 data 中提取给定的字段(我在这里定义为 unknown 类型,因为它对这个问题并不重要):

declare function getField<F extends Field>(
data: unknown,
field: F
): FieldTypes[F];

const position: number = getField({}, Field.Position);
const name: string = getField({}, Field.Name);

编译没有错误。 getField确实返回 number对于 position和一个 string对于 name .

现在我想写一个getFieldsdata 中提取多个字段的函数按顺序,但我正在努力定义它。以下是我期望它的工作方式:

const fields: [boolean, number, number] = getFields({}, [
Field.Enabled,
Field.Id,
Field.Position,
]);

那么我该如何定义这个函数呢?这是我尝试过的,但它没有返回正确的类型:

declare function getFields<F extends Field>(
data: unknown,
fields: F[]
): FieldTypes[F][];

最佳答案

这应该适合你:

enum Field {
Id,
Position,
Name,
Enabled,
}

interface FieldTypes extends Record<Field, any> {
[Field.Id]: number;
[Field.Position]: number;
[Field.Name]: string;
[Field.Enabled]: boolean;
}

首先,我们创建另一个 type,它接受 Field 的元组并返回具有相应类型的元组。

type MultipleFieldTypes<T extends readonly Field[]> = {
[K in keyof T]: T[K] extends keyof FieldTypes ? FieldTypes[T[K]] : never
}

然后我们修改函数 getFields 以接受 Field 的元组作为通用类型 F。作为返回类型,我们将 F 传递给 MultipleFieldTypes

declare function getFields<F extends Field[]>(
data: unknown,
fields: [...F]
): MultipleFieldTypes<F>;

现在我们有了正确的返回类型:

const fields: [boolean, number, number] = getFields({}, [
Field.Enabled,
Field.Id,
Field.Position,
]);

Playground

关于typescript - 将数组参数类型映射到数组返回类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72154906/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com