2 votes

Erreur de type générique TS2322 : Le type '{ id : null ; }' n'est pas assignable au type 'T'.

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.

https://stackblitz.com/edit/typescript-rthmqv

1voto

Vous devez indiquer à votre objet de données que ce que vous lui assignez est en fait R

abstract class ResourceComponent<R extends Resource> {
  protected state: ResourceState<R> = {
    data : { // Type checking KO
      id: "null"
    } as R,
    hash: ''
  };
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X