microsoft / microsoft/TypeScript
Methods in simple mixin result as type any.
Nobody has claimed this yet.
- Dominant language
- Go
- Stars
- 111k
- Forks
- 14.3k
- Avg merge
- 2d 4h
- Merged PRs (30d)
- 132
Description
TypeScript Version: 3.9.2
Search Terms:
typescript mixin method is any
Code
type AnyCtor = new (...a: any[]) => any
function Foo<T extends AnyCtor>(Base: T) {
return class Foo extends Base {
foo() {}
}
}
function Bar<T extends AnyCtor>(Base: T) {
return class Bar extends Base {
bar() {}
}
}
function One<T extends AnyCtor>(Base: T) {
return class One extends Base {
one() {}
}
}
function Two<T extends AnyCtor>(Base: T) {
return class Two extends Base {
two() {}
}
}
function Three<T extends AnyCtor>(Base: T) {
return class Three extends One(Two(Base)) {
three() {}
}
}
class MyClass extends Three(Foo(Bar(Object))) {
test() {
// @ts-expect-error
this.foo(123)
// @ts-expect-error
this.bar(123)
// @ts-expect-error // ERROR
this.one(123) // this.one is type `any`!
// @ts-expect-error // ERROR
this.two(123) // this.two is type `any`!
// @ts-expect-error
this.three(123)
console.log('no runtime errors')
}
}
const m = new MyClass()
m.test()
Expected behavior:
There should be an error on all the lines marked with // @ts-expect-error
Actual behavior:
There is no type error on the lines with this.one and this.two because this.one and this.two are seen as type any.
The expectation is that the one and two methods have the proper type (with zero parameters) which would therefore cause a type error from passing in arguments.
Related Issues:
Someone from the Discord chat thought perhaps https://github.com/microsoft/TypeScript/pull/29571 might be related, but not with 100% certainty. They do however think this is a bug.
Ultimately, making mixins in TypeScript is too hard. It's too easy to get them wrong and they become a very inconvenient in TypeScript (whereas they are very convenient in plain JavaScript).
Also related: https://github.com/microsoft/TypeScript/issues/32080
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 linked Playground reproduction and compare the behavior discussed in issues 32080 and pull request 29571. Trace how the nested mixin calls infer the types of one and two; done means all six @ts-expect-error lines produce type errors, including the calls with extra arguments.
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
- 35/100