【发布时间】:2017-07-25 18:56:31
【问题描述】:
我以为我理解了新的TS 2.1 Pick type 的用途,但后来我看到了how it was being used in the React type definitions,我不明白:
declare class Component<S> {
setState<K extends keyof S>(state: Pick<S, K>, callback?: () => any): void;
state: Readonly<S>;
}
这允许您这样做:
interface PersonProps {
name: string;
age: number;
}
class Person extends Component<{}, PersonProps> {
test() {
this.setState({ age: 123 });
}
}
我的困惑是keyof S 是{ name, age },但我只用age 调用setState()——为什么它不抱怨缺少name?
我的第一个想法是,因为Pick 是一种索引类型,所以它根本不需要所有键都存在。说得通。但是如果我尝试直接分配类型:
const ageState: Pick<PersonProps, keyof PersonProps> = { age: 123 };
它确实抱怨缺少name 键:
Type '{ age: number; }' is not assignable to type 'Pick<PersonProps, "name" | "age">'.
Property 'name' is missing in type '{ age: number; }'.
我不明白这一点。 似乎我所做的只是用 S 已分配给的类型填写 S,然后它从允许 子集键变为需要所有键。这是一个很大的区别。 Here it is in the Playground。谁能解释这种行为?
【问题讨论】:
标签: reactjs typescript typescript2.1