You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将对象中名称带?的键转为可选属性类型?

TypeScript类型转换:将键名带问号的属性转为可选属性

问题描述

给定对象及对应类型:

const obj = {
  a: 1,
  "b?": 2,
  "c?": 3
}

type OriginalObj = {
  a: number;
  "b?": number;
  "c?": number;
}

需要实现一个类型工具,将上述类型转换为:

type TransformedObj = {
  a: number;
  b?: number;
  c?: number;
}

核心是把键名包含?的属性,转为可选属性并移除键名中的问号。

实现代码

可以通过映射类型结合模板字面量类型完成转换:

// 移除键名末尾的问号
type RemoveTrailingQuestion<K extends string> = K extends `${infer Name}?` ? Name : K;

// 核心转换类型
type TransformObj<T> = {
  [K in keyof T as RemoveTrailingQuestion<K>]: K extends `${infer _}?` ? T[K] | undefined : T[K];
};

// 测试验证
type OriginalObj = {
  a: number;
  "b?": number;
  "c?": number;
};

type TransformedObj = TransformObj<OriginalObj>;
// 转换后 TransformedObj 的类型为:
// {
//   a: number;
//   b?: number | undefined;
//   c?: number | undefined;
// }

逻辑说明

  • RemoveTrailingQuestion:利用模板字面量类型匹配以?结尾的键名,提取出不带问号的属性名。
  • TransformObj:
    1. 遍历原类型的所有键,通过as RemoveTrailingQuestion<K>重命名键名;
    2. 对原键名带?的属性,将其类型设置为原类型 | undefined,效果等价于TypeScript的可选属性语法?。

内容的提问来源于stack exchange,提问作者tdranv

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 08:10:28