microsoft / microsoft/TypeScript

Different behavior when declare property or method in a class about covariance

Abierto
#42,002 4 comentarios 0 reacciones 0 asignados Ver en GitHub

Nadie ha tomado este issue todavía.

Docs
Lenguaje dominante
Go
Estrellas
111k
Forks
14.4k
Merge medio
1 d 19 h
PR fusionados (30 d)
117

Descripción

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:

Guía de contribución

Abrir la guía de contribución

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Línea de trabajo

Comienza con la reproducción en TypeScript Playground enlazada y con la sección del manual «Type Compatibility» mencionada en el issue. Compara el comportamiento reportado de la clase genérica para las formas de propiedad funcional y de método, y determina después si la diferencia es intencional; el trabajo estará terminado cuando se haya establecido un comportamiento esperado y exista la cobertura correspondiente en el compilador o en la documentación.

Escrito por el modelo de indexación a partir del texto del issue.

Evaluación

Stack tecnológico
typescript
Área
compilers
Tipo de issue
Error
Dificultad
4/5
Tiempo estimado
3-5 días
Estado de actividad
Estancado
Claridad
Necesita aclaración
Aptitud para principiantes
35/100

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.