microsoft / microsoft/TypeScript
Different behavior when declare property or method in a class about covariance
Personne n'a encore pris cette issue.
- Langage dominant
- Go
- Étoiles
- 111k
- Forks
- 14.3k
- Merge moyen
- 2 j 4 h
- PR mergées (30 j)
- 132
Description
TypeScript Version: 4.1.2
Search Terms: In ts doc - type compatibility, it seems like not mentioned about this.
Code
class M1 {
c: number = 1;
}
export class M2 extends M1 {
a: number = 1;
}
type Func<M extends M1> = (m: M) => number;
interface IFunc<M extends M1> {
func1?: Func<M>,
func2: Func<M>,
}
class R1<M extends M1 = M1> implements IFunc<M> {
// when delete this property, it will be no error.
public func1 = (m: M) => {
return m.c
}
public func2(m: M) {
return m.c
};
}
type IRConstructor<M extends M1, R extends R1<M>> = new () => R;
export class R2 extends R1<M2> {
}
type A = IRConstructor<M1, R1>;
let a1: A = R2; // error: Type 'typeof R2' is not assignable to type 'IRConstructor<M1, R1<M1>>'.
console.log(a1);
Expected behavior:
Should declare a property or a method in class has same behavior? I'm not sure...
Actually I want to know how can I make these code without error when I have to use functional property.
Actual behavior:
When you just decalre a method which is compatible with IFunc<M1>, it will be fine. But when you declare a functional property which is compatible with IFunc<M1>, it will be an error.
Playground Link:
Or, you can see playground
Related Issues:
Guide de contribution
Ouvrir le guide de contribution
Par où commencer
- Lisez l'issue en entier, puis le guide de contribution du projet.
- Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
- Forkez le dépôt et travaillez sur une branche.
- Ouvrez une pull request qui référence le numéro de l'issue.
Piste de recherche
Commencez par la reproduction TypeScript Playground liée et par la section « Type Compatibility » du manuel référencée dans l’issue. Comparez le comportement signalé de la classe générique pour les formes de propriété fonctionnelle et de méthode, puis déterminez si la différence est intentionnelle ; le travail est considéré comme terminé lorsqu’un comportement attendu a été défini et qu’une couverture correspondante existe dans le compilateur ou la documentation.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Évaluation
- Stack technique
- typescript
- Domaine
- compilers
- Type d'issue
- Bug
- Difficulté
- 4/5
- Temps estimé
- 3-5 jours
- Activité
- À l'abandon
- Clarté
- À clarifier
- Accessibilité débutants
- 35/100