microsoft / microsoft/TypeScript
Unable to specify return type of class extends T implements IFooable
Nobody has claimed this yet.
- Dominant language
- Go
- Stars
- 111k
- Forks
- 14.3k
- Avg merge
- 2d 4h
- Merged PRs (30d)
- 132
Description
TypeScript Version: 2.2.1 / nightly (2.2.0-dev.201xxxxx)
Code
// A *self-contained* demonstration of the problem follows...
export type Constructor<T> = new (...args: any[]) => T;
export interface IFooable { FooProp: string; }
export function FooableMixin<T extends Constructor<{}>>(Base: T) {
return class extends Base implements IFooable {
FooProp: string;
constructor(...args: any[]) {
super(...args);
}
}
}
export class BaseBar { BarProp: string = "baz"; }
export class FooableBar extends FooableMixin ( BaseBar ) {}
let foobar = new FooableBar();
foobar.FooProp = foobar.BarProp;
/* This is ok since FooableBar extends an Anonymous class inheriting from BaseBar and implementing IFooable */
If I turn on "declaration: true" in tsconfig.json this constuct breaks since the Anonymous class counts as private and not exported type (error TS4060) which is kind of natural since it is Anonymous.
What we need is a way to describe Classes as return types.
Expected behavior:
A d.ts file with a type declaration for the Mixin function Fooable that defines a Anonymous Class return type in the style of:
declare function Fooable(T extends Constructor<{}>): (class extends T implements IFooable);
Actual behavior:
TS4060 error when compiling with the "declaration" flag.
If casting the Anonymous Class return value to or T, the interface is lost.
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start with the self-contained FooableMixin example in the issue and compile it with declaration enabled. Investigate declaration emit for the anonymous class returned by FooableMixin; done means the generated .d.ts describes the class extending T and implementing IFooable without TS4060 or losing the interface.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- typescript
- Domain
- compilers
- Issue type
- Bug
- Difficulty
- 5/5
- Estimated time
- Over a week
- Activity status
- Stale
- Clarity
- Mostly clear
- Newbie friendliness
- 25/100