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

TypeScript中如何挑选并重命名类型键,保留JSDoc与属性链接?

解决TypeScript重命名类型属性时保留JSDoc与属性链接的问题

直接通过Type['Prop']的方式提取属性类型,确实会丢失原属性的JSDoc和编辑器里的属性链接。要解决这个问题,可以用映射类型实现属性的挑选与重命名,完整保留原属性的元信息。

第一步:实现重命名属性的工具类型

先写一个通用工具类型RenameProp,它能把目标类型里的指定属性重命名为新名称,同时保留原属性的所有类型信息和JSDoc:

type RenameProp<
  T extends object,
  OldKey extends keyof T,
  NewKey extends string
> = Omit<T, OldKey> & {
  [K in NewKey]: T[OldKey]
}

这个工具类型的逻辑很直白:

  • 用Omit<T, OldKey>移除原类型里要重命名的属性
  • 通过映射类型把原属性的类型绑定到新属性名上

第二步:应用到你的示例中

把原来的ChildProps写法改成用这个工具类型,结合接口继承实现需求:

interface BoxProps {
  /** Some elaborate description */
  className: string
}

interface LayoutProps {
  /** Different elaborate description */
  className: string
}

// 先把LayoutProps的className重命名为outerClassName
type RenamedLayoutProps = RenameProp<LayoutProps, 'className', 'outerClassName'>

// 合并BoxProps和重命名后的属性
interface ChildProps extends BoxProps, RenamedLayoutProps {}

declare const x: ChildProps

现在在编辑器里查看x.outerClassName时,就能看到原LayoutProps.className的JSDoc,并且能跳转到原属性的定义处,完全保留了元信息。

简化写法(可选)

如果只需要提取单个属性并重命名,也可以省略单独定义RenamedLayoutProps的步骤:

interface ChildProps 
  extends BoxProps, 
  RenameProp<Pick<LayoutProps, 'className'>, 'className', 'outerClassName'> {}

用Pick先选中LayoutProps里的className,再用RenameProp重命名,效果完全一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 22:42:06