microsoft / microsoft/TypeScript
Improve feedback for abstract class instantiation error messages
还没有人认领这个 Issue。
- 主要语言
- Go
- 星标
- 111k
- 派生
- 14.4k
- 平均合并
- 1 天 19 小时
- 30 天内合并 PR
- 117
描述
SUGGESTION
Recently, I was trying to use a library written in ES2015 in an Ionic 2 project, and kept getting a Cannot instantiate abstract class 'Foo'. Foo is a concrete class that extends abstract class Bar, which extends abstract class Baz. The problem turned out to be a typo in Bar.d.ts (see below), which (I believe) made Typescript think that Foo did not implement some abstract methods of Bar and/or Baz (I'm still not sure which), but it took me a day and half to figure out what was going on. This error message should have more information about why Foo is abstract: Foo is declared as abstract or Foo does not implement abstract methods ...
TypeScript Version: 2.0.9
Code
Baz.d.ts
export as namespace Baz;
declare abstract class Baz {
abstract baz(): string;
}
Bar.d.ts
export as namespace BarTypo;
declare abstract class Bar extends Baz {
abstract foo(): void;
abstract bar(): string;
baz(): string;
}
export { Bar };
Foo.d.ts
import { Bar } from './bar.d';
export as namespace Foo;
declare class Foo extends Bar {
constructor(opts?);
foo(): void;
bar(a: string): string;
}
export { Foo };
otherProject.ts
import { Foo } from 'library';
export class Service {
foo: Foo;
constructor() {
this.foo = new Foo({ opt: true });
}
}
Expected behavior:
Error: Cannot instantiate abstract class 'Foo'. It does not implement abstract method(s): baz.
OR
Error: Cannot instantiate abstract class 'Foo'. It does not implement abstract method(s): foo, bar.
OR
Error: Cannot instantiate abstract class 'Foo'. It does not implement abstract method(s): baz (from Baz); foo, bar (from Bar).
Actual behavior:
Error: Cannot instantiate abstract class 'Foo'.
贡献指南
从这里开始
- 先读完整个 Issue,再读项目的贡献指南。
- 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
- Fork 仓库,在一个分支上完成修改。
- 提交 Pull Request,并在描述里引用这个 Issue 编号。
调研方向
首先,使用此处描述的 TypeScript 2.0.9 行为,通过 Baz.d.ts、Bar.d.ts、Foo.d.ts 和 otherProject.ts 重现该诊断。跟踪编译器的抽象类实例化错误,并使消息指出相关缺失的抽象方法或声明。完成的标准是示例报告 Foo 无法实例化的原因,并与其中一条拟议的预期消息相匹配。
由索引模型根据 Issue 内容生成。
评估
- 技术栈
- typescript
- 领域
- compilers
- Issue 类型
- 功能
- 难度
- 4/5
- 预计耗时
- 3-5 天
- 活跃度
- 停滞
- 描述清晰度
- 基本清楚
- 新手友好度
- 35/100