コンテンツにスキップ

[TypeScript] 2.2

TypeScript2.2のリリース内容まとめ

Support for Mix-in classes

NOT NECESSARY NORMAL

ES2015のMixin class patternをサポートするようになった。
TypeScriptは多重継承1できないため、そのようなケースで利用できる。

Mixin constructor type

Xに対するnew (...args: any[]) => Xのこと。

Mixin class

以下の条件を満たすクラスのこと。

  • 型パラメータがConstructor (Constructor<AnyClass>) を継承している
  • コンストラクタの引数が(...args: any[])かつスーパークラスへの受け渡しがsuper(...args)

具体例。

type Constructor<T = {}> = new (...args: any[]) => T;

// すべてのクラスに適応可能なMixin
function Debuggable<C extends Constructor>(BaseClass: C) {
  return class extends BaseClass {
    canDebug = true;
  };
}

// Humanのシグニチャを持つクラスのみに適応可能なMixin
function Ohagozable<C extends Constructor<Human>>(BaseClass: C) {
  return class extends BaseClass {
    ohagoza(message: string) {
      console.log(`${this.name}: ohagoza! ${message}`);
    }
  };
}

class Human {
  constructor(public name: string) {}
}

// Mixin適応
const OhagozaHuman = Debuggable(Ohagozable(Human));

// Mixin適応クラスのインスタンス作成
const take = new OhagozaHuman("Take100");

take.ohagoza(`My tag is ${take.canDebug}`);
// -> Take100: ohagoza! My tag is true

object type

NOT NECESSARY EASY

primitiveでない型として、(obj: object)のようなobject型が追加された。
以下のいずれでもないような型。

  • number
  • string
  • boolean
  • symbol
  • null
  • undefined

Support for new.target

UNKNOWN CAN NOT UNDERSTAND

ES2015のnew.targetに対応した。
new.targetについて、仕様と使い所を理解できていない。。

Better checking for null/undefined in operands of expressions

NOT NECESSARY EASY

式のオペランドに対するnull/undefinedに対するチェックが改善した。

演算子 エラーになる条件
+ どちらかのオペランドがNullable かつ string or any型ではない
- * ** / % ^ どちらかのオペランドがNullable
<< >> >>> & どちらかのオペランドがNullable
< > <= >= in どちらかのオペランドがNullable
instanceof 右オペランドがNullable
単項演算子 (+ - ~ ++ --) オペランドがNullable

--strictNullChecksが無効の場合は実質使えない。
var: string | undefinedのような表現ができないため。

Dotted property for types with string index signatures

SHOULD EASY

string型のindexに限り、ドットアクセスができるようになった。

const hoge = {
  key: "value"
}

hoge.key
const hoge = {
  2: "value"
}

// string型以外のindexにはドットアクセスできない
hoge.2

Support for spread operator on JSX element children

HAD BETTER EASY

JSXの子要素としてspread operatorが使えるようになった。
詳細は facebook/jsx/issues/57 を参照。

New jsx: react-native

HAD BETTER EASY

--jsxオプションの値にreact-nativeが追加された。
指定すると、JSXの有無にかかわらず.jsファイルに変換する。 (.jsxファイルにはしない)


  1. class A extends B, C のようなパターンを多重継承という