microsoft / microsoft/TypeScript
Methods in simple mixin result as type any.
Nessuno ha ancora preso questa issue.
- Lingua principale
- Go
- Stelle
- 111k
- Fork
- 14.3k
- Merge medio
- 1g 19h
- PR unite (30g)
- 117
Descrizione
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
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 dalla riproduzione collegata in Playground e confronta il comportamento discusso nelle issue 32080 e pull request 29571. Traccia il modo in cui le chiamate annidate ai mixin inferiscono i tipi di one e two; il lavoro è completato quando tutte e sei le righe @ts-expect-error producono errori di tipo, comprese le chiamate con argomenti aggiuntivi.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Valutazione
- Stack tecnologico
- typescript
- Ambito
- compilers
- Tipo di issue
- Bug
- Difficoltà
- 5/5
- Tempo stimato
- Più di una settimana
- Stato di attività
- Ferma
- Chiarezza
- Abbastanza chiara
- Idoneità per principianti
- 35/100