microsoft / microsoft/TypeScript
Improve feedback for abstract class instantiation error messages
Nessuno ha ancora preso questa issue.
- Lingua principale
- Go
- Stelle
- 111k
- Fork
- 14.3k
- Merge medio
- 2g 4h
- PR unite (30g)
- 132
Descrizione
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'.
Guida per i contributori
Apri la guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Direzione di ricerca
Inizia riproducendo la diagnostica con Baz.d.ts, Bar.d.ts, Foo.d.ts e otherProject.ts, utilizzando il comportamento di TypeScript 2.0.9 descritto qui. Traccia l'errore del compilatore durante l'istanza di una classe astratta e fai in modo che il messaggio identifichi i metodi astratti o la dichiarazione rilevanti mancanti. Il lavoro è completato quando l'esempio segnala perché Foo non può essere istanziato e corrisponde a uno dei messaggi attesi proposti.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Valutazione
- Stack tecnologico
- typescript
- Ambito
- compilers
- Tipo di issue
- Funzionalità
- Difficoltà
- 4/5
- Tempo stimato
- 3-5 giorni
- Stato di attività
- Ferma
- Chiarezza
- Abbastanza chiara
- Idoneità per principianti
- 35/100