microsoft / microsoft/TypeScript
Mixin / Inheritance problem with Typescript - string not assignable to string|number|symbol
Nessuno ha ancora preso questa issue.
- Lingua principale
- Go
- Stelle
- 111k
- Fork
- 14.4k
- Merge medio
- 1g 19h
- PR unite (30g)
- 117
Descrizione
Bug Report
I have a typescript class. I'd like to subclass it and add a mixin. However, it keeps telling me that string not assignable to string|number|symbol. I don't understand why because the method signatures are the same.
🔎 Search Terms
typescript mixin prototype
🕗 Version & Regression Information
4.9.5
I just started using Typescript, so 4.9.5 is the version I was using since I started seeing it.
⏯ Playground Link
this shows the problem with UserRecord
this shows the way to work around the problem
💻 Code
This is as short as I can make the example and still show what's happening:
type TModel = {
'User' : {
username : string,
password : string | undefined,
},
'APIKey' : {
privateKey: string,
}
};
type TProps<T extends keyof TModel> = Partial<TModel[T]>;
type Constructor<T = {}> = new (...args: any[]) => T;
class VingRecord<T extends keyof TModel> {
constructor( private props: TProps<T>) { }
public set<K extends keyof TProps<T>>(_key: K) {}
}
function RoleMixin<T extends Constructor>(Base: T) {
return class RoleMixin extends Base { };
}
class UserRecord extends RoleMixin(VingRecord<'User'>) {
public set<K extends keyof TProps<'User'>>(_key: K) {}
}
and if you replace the RoleMixin with this it hides the problem with the funky prototype:
function RoleMixin<T extends IConstructable>(Base: T) {
class RoleMixin extends Base {};
return RoleMixin as {
new (...args: any): RoleMixin;
prototype: any;
} & T;
}
🙁 Actual behavior
The code works, but typescript has a problem with the mixin thinking the type on VingRecord is any rather than 'User'. So it reports a type mismatch on the UserRecord.
More detail here with the guys who spotted the behavior
🙂 Expected behavior
I should be able to do the inheritance as shown in the code sample above without having to do the funky return from the mixin.
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 con la riproduzione collegata in TypeScript Playground e confrontala con la soluzione alternativa collegata, concentrandoti sulla gestione dei mixin generici e dell’ereditarietà. L’issue è completata quando l’esempio originale supera il controllo dei tipi senza la soluzione alternativa, preservando il tipo 'User' attraverso UserRecord.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Valutazione
- Stack tecnologico
- typescript
- Ambito
- compilers
- Tipo di issue
- Bug
- Difficoltà
- 4/5
- Tempo stimato
- 3-5 giorni
- Stato di attività
- Ferma
- Chiarezza
- Abbastanza chiara
- Idoneità per principianti
- 35/100