LoginSignup
4
4

More than 5 years have passed since last update.

TypeScript 2.1 で setState() が型安全になるぞー

Last updated at Posted at 2016-12-08

昨日 TypeScript 2.1 がリリースされました。リリースされるの早いなあと思いながら眺めていたのですが、興味深い機能が追加されました。 Partial<T> 型です。

Partial<T> 型は、T型のフィールドを全てオプショナルにした型です。

たとえば次のような T1 があったとき、

interface T1 {
  n: number;
  s: string;
}

Partial<T1> は次と等価になります。

// Partial<T1> 型はこんな感じ。
{
  n?: number;
  s?: string;
}

これのどこが便利なの?と疑問に思うかもしれませんが、 React の setState() を的確に表現できるようになるのです。
setState() の引数に渡すのはまさに Partial<State> 型です。
今までは cast (type assertion) してウソをついて過ごしてきましたが、これからは正々堂々と生きていくことができます!

DefinitelyTyped には既に PR があがっています。

-        setState(f: (prevState: S, props: P) => S, callback?: () => any): void;
-        setState(state: S, callback?: () => any): void;
+        setState(f: (prevState: S, props: P) => Partial<S>, callback?: () => any): void;
+        setState(state: Partial<S>, callback?: () => any): void;

早く merge されるといいですね!

ちなみに Partial<T> は同じく 2.1 から追加された keyof と lookup 型を利用して宣言されています

/**
 * Make all properties in T optional
 */
type Partial<T> = {
    [P in keyof T]?: T[P];
};

typeof T はTのキーとなる文字列リテラル型の直和型となるようで、こちらも何かの時に便利そうです。

4
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
4