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
構文を使用した時にバインド対象外とするプロパティを指定するオブジェクト。