私は新しいTS 2.1 Pick
typeの目的を理解すると思ったが、その後、私はhow it was being used in the React type definitionsを見て、私は理解していない:なぜ新しい `Pick <T、K extends keyof T>型はReactの` setState() `の` K`の部分集合を許可しますか?
interface PersonProps {
name: string;
age: number;
}
class Person extends Component<{}, PersonProps> {
test() {
this.setState({ age: 123 });
}
}
ここでの私の混乱がある:あなたがこれを行うことができます
declare class Component<S> {
setState<K extends keyof S>(state: Pick<S, K>, callback?:() => any): void;
state: Readonly<S>;
}
そのkeyof S
は{ name, age }
ですが、私はsetState()
とage
としか電話しません - なぜそれが不足していると文句を言っていませんか?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。誰もこの行動を説明できますか?
タイプ '「年齢」は'タイプ '「名前」を拡張するために言うことができます* | "年齢"。* ああ、私はそれを推測していないでしょう、私は "名前" | 「年齢」は「年齢」を拡張します。説明ありがとう! – Aaron
もう一度やってみると申し訳ありませんが、私は今行動を理解していますが(感謝!)、年齢のスーパータイプであることを本当に合理化することはできません。コンパイラがどのようにそれを見ているのかはっきりとしていますが、サブタイプではありません。一見等価なインターフェース '{name、age}'と '{age} 'がお互いにどう関係しているのかが逆になります。この根拠を説明できますか? – Aaron
一般的なタイプの制約では、おそらく、 "より具体的なタイプ"であると解釈するのが最善です。タイプAB = "a" | "b"; 'とタイプABC =" a "| "b" | "c"; '。あなたが変数 'const abc:ABC =" c ";'を持っていれば、それを 'AB'型の変数に代入することはできませんでしたが、' AB'型の有効な値は 'ABC'の有効な値です。 「AB」はより特定のタイプの「ABC」であるため、「AB」は「ABC」を拡張すると言える。 –