J'obtiens une erreur de vérification de type TS sur le code ci-dessous.
interface Resource {
id: string;
}
interface ResourceState<T> {
data: T;
hash: string;
}
abstract class ResourceComponent<R extends Resource> {
protected state: ResourceState<R> = {
data: { // Type checking KO
id: ''
},
hash: ''
};
}
// Doesn't suit my use case
// abstract class ResourceComponent<Resource> {
// protected state: ResourceState<Resource> = {
// data: {
// id: null
// },
// hash: ''
// };
// }
interface Model extends Resource {
name: string;
}
class ModelComponent extends ResourceComponent<Model> {
constructor() {
super();
this.state.data.name = 'ModelComponent'; // Type checking OK
this.state.data.age = 20; // Type checking OK
console.log(this.state.data);
}
}
const component = new ModelComponent();
À la ligne 12 précisément, je reçois l'erreur TS2322 : Le type '{ id : null ; }' n'est pas assignable au type 'R'. TypeScript ne devrait-il pas comprendre que puisque 'R extends Resource', les données peuvent être initialisées avec une valeur ayant la forme du type Resource.
Sur les lignes 36, 37, TS fait la vérification de type correctement.