コンテンツにスキップ

[TypeScript] 3.0

TypeScript3.0のリリース内容まとめ

Rest parameters with tuple types

HAD BETTER EASY

Rest parametersにタプルが対応した。

function foo1(...args: [number, string, boolean]) {
  console.log(args)
}

foo1(10, "ten", true)
// -> [ 10, 'ten', true ]

Spread expressions with tuple types

HAD BETTER EASY

Spread operatorのタプル版に対応した。

function foo(x: number, y: string, z: boolean) {
  console.log(x, y, z);
}

const args: [number, string, boolean] = [10, "ten", true];
foo(...args);
// -> 10 ten true

Generic rest parameters

HAD BETTER NORMAL

Rest parametersにジェネリクスを使用できるようになった。
any[]はTuple型に推論/キャプチャされる。

それを利用すると、以下のような部分適応する関数bindの型推論ができる。

declare function bind<T, U extends any[], V>(
  f: (x: T, ...args: U) => V,
  x: T
): (...args: U) => V;

実装したコード例は以下。

function bind<T, U extends any[], V>(
  f: (x: T, ...args: U) => V, // 関数fの第1引数をT、第2引数以降をU(タプル) とする
  x: T // 関数fの第2引数は 上記fの第1引数と同じ型T
): (...args: U) => V {
  // 戻り値は関数型. その引数は関数fの第2引数以降 (第1引数はbindされた)
  return (...args: U) => f(x, ...args);
}

function say(name: string, age: number, shouldAgeSecret: boolean): string {
  return `私の名前は${name}です。 歳は${shouldAgeSecret ? "秘密" : age}です。`;
}

const mimizouSay = bind(say, "みみぞう"); // 第2引数がstringと推論される
console.log(mimizouSay(333, false));
// -> 私の名前はみみぞうです。 歳は333です。

const mimizou33YearSay = bind(mimizouSay, 33); // 第2引数がnumberと推論される
console.log(mimizou33YearSay(false));
// -> 私の名前はみみぞうです。 歳は33です。

const mimizou33YearSaySecret = bind(mimizou33YearSay, true); // 第2引数がbooleanと推論される
console.log(mimizou33YearSaySecret());
// -> 私の名前はみみぞうです。 歳は秘密です。

Optional elements in tuple types

HAD BETTER EASY

タプルでも?でOptionalを表現できるようになった。

let t: [number, string?, boolean?];

t = [10];
t = [10, undefined];
t = [10, "10"];
t = [10, "10", undefined];
t = [10, "10", true];