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

TypeScript深对象重映射:映射类型中如何提取嵌套default属性类型

报错原因

泛型T未添加类型约束,TypeScript 无法保证T的每个子属性都包含default键,因此不允许直接用'default'做索引访问。

正确实现

基础版(保留原属性名)

给泛型添加强制约束,明确传入的T的所有子属性都必然包含default字段:

type PickDefault<T extends Record<keyof T, { default: unknown }>> = {
  [key in keyof T]: T[key]['default']
}

// 测试效果
type Test = PickDefault<MyModule>
// Test类型为:{ title: string; length: number }

适配需求版(重命名title为dataModel)

如果需要固定把title属性替换为dataModel,可以在映射时修改键名:

type PickDefaultRename<T extends Record<keyof T, { default: unknown }>> = {
  [key in keyof T as key extends 'title' ? 'dataModel' : key]: T[key]['default']
}

// 测试效果
type NewMyModule = PickDefaultRename<MyModule>
// NewMyModule类型为:{ dataModel: string; length: number },完全符合预期

鲁棒版(自动过滤无default的属性)

如果传入的类型可能存在部分属性没有default字段,不想触发报错,可以加条件判断自动过滤无效属性:

type PickDefaultSafe<T> = {
  [key in keyof T as T[key] extends { default: unknown } ? key : never]: T[key]['default']
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.14 13:15:05