← 中文资源

简体中文版本

TypeScript TS1086 — 环境上下文不可声明访问器

通过把接口或声明文件中的访问器改为普通属性,修复 TS1086——环境与接口上下文不能包含 get/set 体。

阅读英文原文

症状

本篇调试指南针对“TypeScript TS1086 — 环境上下文不可声明访问器”。内容涵盖可观察的症状、可复现的诊断路径、根本原因、具体修复方式,以及如何验证修复并防止回归。

可观察到的症状包括:

  • error TS1086: 环境上下文中不能声明访问器
  • 某 .d.ts 或接口使用 get/set 导致编译失败
  • 把类移入声明文件后出现该错误

诊断

先在隔离环境中复现故障,再按顺序执行以下检查,逐步缩小范围。

步骤 1

npx tsc --noEmit 2>&1 | grep TS1086

错误行标出接口或声明文件中的 get/set。

步骤 2

grep -n "get \|set \|interface " *.d.ts

把访问器替换为普通属性签名,符合环境上下文允许的形式。

常见诱因(按出现频率排序):

  • 接口或环境声明中包含了 get/set 访问器
  • 从实现代码复制的 .d.ts 保留了访问器语法
  • 在不允许实现体的位置使用了带访问器体的 declare class

根因

环境上下文(接口与声明文件)只描述类型而无实现,因此蕴含 get/set 实现体的访问器在此非法。TypeScript 不臆测意图,直接报 TS1086。

修复

在接口与声明文件中使用属性签名、把值暴露为可读属性,或把访问器移入真实的类实现。

注意:把访问器压平为属性会改变只读语义;值不可设置处应加 readonly。

// ❌ interface { get name(): string; }  -> TS1086

interface User {
  readonly name: string;   // ✅ property signature
  age: number;
}

// accessors belong in a real class
class UserImpl implements User {
  private _name = '';
  get name() { return this._name; }
}

验证

运行 tsc –noEmit 并确认 TS1086 消失;验证消费方在运行期仍能正确读取该属性。

修复后补充一条回归测试,复现原始症状,防止问题再次出现。

这类故障通常是环境问题而非纯逻辑错误,因此在缺陷记录中应写明完整命令、环境变量与工作目录。请用最小的脚本复现,待最小用例清楚后再扩大范围。为这类故障准备一份简短的排查清单,能显著减少下次排障时间。