Je pensais avoir compris le but de la nouvelle TS 2.1 Pick
type mais ensuite j'ai vu comment il était utilisé dans les définitions de type React et je ne comprends pas :
declare class Component<S> {
setState<K extends keyof S>(state: Pick<S, K>, callback?: () => any): void;
state: Readonly<S>;
}
Ce qui vous permet de faire ça :
interface PersonProps {
name: string;
age: number;
}
class Person extends Component<{}, PersonProps> {
test() {
this.setState({ age: 123 });
}
}
Ma confusion ici est que keyof S
es { name, age }
mais j'appelle setState()
avec seulement age
-- pourquoi ne se plaint-il pas de la disparition name
?
Ma première pensée est que parce que Pick
est un type d'index, il n'est simplement pas nécessaire que toutes les clés existent. C'est logique. Mais si j'essaie d'assigner le type directement :
const ageState: Pick<PersonProps, keyof PersonProps> = { age: 123 };
Il fait se plaignent de l'absence name
clé :
Type '{ age: number; }' is not assignable to type 'Pick<PersonProps, "name" | "age">'.
Property 'name' is missing in type '{ age: number; }'.
Je ne comprends pas ça. C'est semble Je n'ai fait que remplir S
avec le type que S
est déjà attribué, et il est passé de l'autorisation d'un sous-ensemble de clés pour exiger tous les clés. C'est une grande différence. Le voici dans la cour de récréation%3A%20void%3B%0A%20%20%20%20state%3A%20Readonly%3CS%3E%3B%0A%7D%0A%0Ainterface%20PersonProps%20%7B%0A%20%20name%3A%20string%3B%0A%20%20age%3A%20number%3B%0A%7D%0A%0Aclass%20Person%20extends%20Component%3C%7B%7D%2C%20PersonProps%3E%20%7B%0A%20%20test()%20%7B%0A%20%20%20%20const%20person%3A%20Pick%3CPersonProps%2C%20keyof%20PersonProps%3E%20%3D%20%7B%20age%3A%20123%20%7D%3B%0A%20%20%20%20this.setState(%7B%20age%3A%20123%20%7D)%3B%0A%20%20%7D%0A%7D) . Quelqu'un peut-il expliquer ce comportement ?