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

如何替换lib.es5.d.ts中TypedPropertyDescriptor的定义?

替换lib.es5.d.ts中TypedPropertyDescriptor的精准定义方案

TS内置lib.es5.d.ts里的TypedPropertyDescriptor接口定义允许混合使用存取器(get/set)和value/writable属性,这不符合JS实际规范——JS中一个属性描述符不能同时包含存取器与value/writable。要替换为更精准的联合交叉类型定义,不能直接修改官方lib文件(升级TS会覆盖),正确做法如下:

1. 创建自定义全局类型声明文件

在项目根目录的src文件夹下创建global.d.ts文件(文件名可自定义,只要是.d.ts格式且被TS识别),写入以下代码:

declare global {
  type TypedPropertyDescriptor<T> = {
    enumerable?: boolean;
    configurable?: boolean;
  } & ({
    set?: (value: T) => void;
  } | {
    get?: () => T;
  } | {
    writable?: boolean;
    value?: T;
  });
}

export {}; // 标记为模块,确保全局声明生效

2. 配置tsconfig.json优先加载自定义声明

修改tsconfig.json的compilerOptions,调整typeRoots让自定义声明目录优先级高于内置类型:

{
  "compilerOptions": {
    "typeRoots": ["./src", "./node_modules/@types"],
    // 其他配置...
  },
  "include": ["src/**/*"]
}

原理说明

  • 自定义的TypedPropertyDescriptor通过交叉类型&把通用属性(enumerable、configurable)和三种互斥的描述符类型(set单独、get单独、value+writable组合)结合,严格限制了合法的描述符结构,完全符合JS规范。
  • 不直接修改官方lib文件是因为TS版本升级时,官方lib会被重置,自定义声明文件能长期生效。
  • 调整typeRoots确保TS优先读取你的自定义类型,覆盖内置的接口定义。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 22:15:08