首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何根据模式的实际值确定要在类型记录中返回的数据类型?

如何根据模式的实际值确定要在类型记录中返回的数据类型?
EN

Stack Overflow用户
提问于 2022-05-28 03:29:37
回答 1查看 41关注 0票数 0

我有这样的代码设置。

我希望返回的数据具有一个动态类型约束。

代码语言:javascript
运行
AI代码解释
复制
type Schema = ('id' | 'name' | 'description' | 'content' | 'createdAt')[];

type Obj = {
  id: number;
  name: string;
  description: string;
  content: string;
  createdAt: Date;
}

function getBySchema(schema: Schema) {
  const result = /* Get the object of the specified field from somewhere according to the schema */
  return result;
}

const picked = getBySchema(["id", "name"]);

// Expect it to pass.
picked.name
// Expect it not to pass.
picked.createdAt

我在函数的参数类型中指定Schema以获得输入提示符。

如何根据模式的实际值动态计算结果的类型?

我尝试过以下几种方法,但是它似乎是基于模式中的所有类型来做出判断的。

代码语言:javascript
运行
AI代码解释
复制
type PickBySchema<T extends Record<string, unknown>, S extends Schema> = S extends (infer I)[] ? I extends string  ? {
  [K in I]: T[K]
} : never : never;
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-05-28 04:50:12

您可以使用(infer U)[] ? U : never推断传递的字符串元组,并将它们映射为结果对象键,如下所示:

代码语言:javascript
运行
AI代码解释
复制
function getBySchema<T extends Schema>(schema: T): {
  [key in (T extends (infer U)[] ? U : never)]: Obj[key]} {

解释:

  • T extends Schema确保schema: T的传入参数为Schema类型。
  • 要使用传入的模式条目作为返回的对象键,我们首先需要使用映射类型创建一个接口,其中键派生自在中传递的Schema字符串的一个联合。为此,我们使用key in约定启动接口,该约定用于迭代一个联合类型来创建属性键。联合类型是通过扩展泛型T变量并通过使用(infer U)[] ? U : never语法推断其条目为新的联合类型来创建的,该语法获得对T有效的最小的联合类型(即传入的内容)。: never表达式用于指示,如果不能推断合并,则key将不是有效值,也不能使用。
  • 一旦导出了可能的键的合并,我们就将相应的值类型设置为Obj[key],这将确保属性值具有与键相应的正确类型。

操场链接

对代码基的进一步改进:

您不必手动键入Obj类型中的键并将它们分配给Schema类型。您可以通过以下方法实现自动化:

代码语言:javascript
运行
AI代码解释
复制
type Schema = (keyof Obj)[];

操场链接。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72415302

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文