¿Por qué el objeto { a: number; } no puede asignarse a escribir 't1'?

Código a continuación:

type T = { a: number };

class A<T1 extends T> {
    constructor(public x: T1 = { a: 1 }){}
};
Type '{ a: number; }' is not assignable to type 'T1'.
  '{ a: number; }' is assignable to the constraint of type 'T1', 
  but 'T1' could be instantiated with a different subtype of constraint 'T'.
-1
Michael_Lee 1 jul. 2019 a las 09:35

1 respuesta

La mejor respuesta

La razón es simple. Aquí T1 es una extensión de T, por lo que todo lo que es un T1 es también un T, pero no a la inversa. Dependiendo de lo que es T1, {a:1} puede no ser asignable a T1. Considere este ejemplo:

type TT = T & {b:string};
new A<TT>();

¿Qué pasará en el constructor entonces? Dado que no pasó el parámetro x, utilizará el valor predeterminado {a:1} para x, pero claramente {a:1} no es un TT.

2
Mu-Tsun Tsai 1 jul. 2019 a las 07:59