TypeScript Handbook を読み進めていく第十一回目。
- Basic Types
- Variable Declarations
- Interfaces
- Classes
- Functions
- Generics
- Enums
- Type Inference
- Type Compatibility
- Advanced Types
- Symbols (今ココ)
- Iterators and Generators
- Modules
- Namespaces
- Namespaces and Modules
- Module Resolution
- Declaration Merging
- JSX
- Decorators
- Mixins
- Triple-Slash Directives
- Type Checking JavaScript Files
Symbols
Introduction
ECMAScript 2015 からプリミティブ型に symbol が追加されました。
symbol 型の値は Symbol コンストラクタを呼ぶことで作成します。
let sym1 = Symbol();
let sym2 = Symbol("key"); // 文字列キーは任意
var sym1 = Symbol();
var sym2 = Symbol("key"); // 文字列キーは任意
別に TypeScript が他の型に変換するわけではないのね
シンボルは変更不可で、かつ、一意です。
let sym2 = Symbol("key");
let sym3 = Symbol("key");
sym2 === sym3; // false、シンボルは常に一意
シンボルは文字列のようにオブジェクトのプロパティとして使用できます。
let sym = Symbol();
let obj = {
    [sym]: "value"
};
console.log(obj[sym]); // "value"
オブジェクトのプロパティにする場合は
[]で囲むのかな?
また、計算されたプロパティとして使用することも可能です。
const getClassNameSymbol = Symbol();
class C {
    [getClassNameSymbol](){
       return "C";
    }
}
let c = new C();
let className = c[getClassNameSymbol](); // "C"
c[getClassNameSymbol]でfunctionが返るから、それを呼び出しているだけ
Well-known Symbols
TypeScript の内部的な振る舞いを制御するためのシンボルがいくつか用意されています。
いろいろ値を変更して振る舞いをカスタマイズできるようだけど、正直なところ、これらの値を変更することはまずないだろう
Symbol.hasInstance
コンストラクタオブジェクトのインスタンスとしてオブジェクトを認識するかどうかを判定する関数。
instanceof 演算子で使用されます。
Symbol.isConcatSpreadable
Array.prototype.concat を呼んだ時に、オブジェクトを配列として展開するかどうかを示す真偽値。
Symbol.iterator
オブジェクトのデフォルトイテレータを返却する関数。
for ... of で使用されます。
Symbol.match
文字列に対し、正規表現でのマッチングを行う正規表現関数。
String.prototype.match で使用されます。
Symbol.replace
部分文字列の置換を行う正規表現関数。
String.prototype.replace で使用されます。
Symbol.search
正規表現に一致する部分のインデックスを返却する正規表現関数。
String.prototype.search で使用されます。
Symbol.species
派生クラスを作成するためのコンストラクタ関数を指定する関数。
Symbol.split
正規表現に一致する部分で文字列を分割する正規表現関数。
String.prototype.split で使用されます。
Symbol.toPrimitive
オブジェクトを対応するプリミティブ型に変換する関数。
ToPrimitive 演算子で使用されます。
Symbol.toStringTag
オブジェクトのデフォルトの文字列表現を作成する際に使用される文字列。
Object.prototype.toString で使用されます。
Symbol.unscopables
with 構文を使用した時にバインド対象外とするプロパティを指定するオブジェクト。