J'essaie d'écrire une classe générique à qui l'on passe une clé key
correspondant à une clé d'une interface parmi un ensemble d'interfaces connues lors de la construction et à qui on peut ensuite passer un objet thing
et accéder en toute sécurité à thing[key]
. C'est ce que j'ai :
interface AB {
a: string
b: number
}
interface BC {
b: number
c: Date
}
type ABC = AB | BC
class Getter<T extends ABC> {
key: keyof T;
constructor(key: keyof T) {
this.key = key;
}
get(thing: T): string {
const value = thing[this.key];
return value.toString();
}
}
const getter = new Getter<AB>('b');
Ici, je m'attendrais à ce que Typescript déduise que parce que T extends ABC
que T[keyof T]
= AB[keyof AB] | BC [keyof BC]
= string | number | date
. Cependant, il semble rester bloqué à T[keyof T]
. Même en ajoutant un as AB[keyof AB] | BC[keyof BC]
à cette ligne n'arrange pas les choses, j'ai besoin as unknown as AB[keyof AB] | BC[keyof BC]
! Y a-t-il un moyen de faire fonctionner ce système sans cette ligne ?
De plus, existe-t-il un moyen de paramétrer la valeur de l'option key
comme un type au lieu de paramétrer sur le type de thing
?