目次
- 背景
- Symbolとは
- ユースケース
- unique symbolとは
1.背景
Branded Type について理解する
この記事の中でunique symbolキーワードが出てきた為です。
Symbols
こちらを和訳し内容をまとめていきます。
2.Symbolとは
- 数値や文字列と同じようにプリミティブなデータ型です。
- Symbol constructorにより作成されます。
const sym1 = Symbol();
const sym2 = Symbol(1); // 任意の数値
const sym3 = Symbol("key"); // 任意の文字列
const sym4 = Symbol(null);
const sym5 = Symbol(undefined);
const sym6 = Symbol(true); //真偽値
const sym6 = Symbol(9007199254740992n);//長整数型
const sym7 = Symbol({})//オブジェクト
const sym8 = Symbol([])//配列
- 不変で唯一の値です。
let sym2 = Symbol("key");
let sym3 = Symbol("key");
sym2 === sym3; // false, symbolは一意の値なので等しくなりません。
Symbol(Symbol())はエラーになリます。
Symbol constructorの引数にSymbol型を指定できません。
Cannot convert a Symbol value to a string
対応方法
文字列型に変換してからSymbol constructorに渡します。
Symbol(String(Symbol()))
Symbol(Symbol().toString())
3. ユースケース
- オブジェクトのkeyとして使えます。
const 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"
4.unique symbolとは
- シンボルを一意なリテラルとして扱えるようにするための型です。
- シンボルのサブタイプです。
unique symbol型の変数をsymbol型の変数mySymbolに割り当てることができます。
const myUniqueSymbol: unique symbol = Symbol();
let mySymbol: symbol;
mySymbol = myUniqueSymbol; // これは正しい、エラーが発生しない
// しかし、unique symbol型の変数に他のシンボルを割り当てることはできません
// myUniqueSymbol = Symbol(); // これはエラーになる
- Symbol()やSymbol.for()、あるいは明示的な型アノテーションで作成されます。
- const宣言と読み取り専用の静的プロパティにのみ使用できます。
- ユニークなシンボルへの参照は、与えられた宣言に結びついた完全にユニークなアイデンティティを意味します。
declare const sym1: unique symbol;
// sym2は定数宣言しかできません。
// let sym2: unique symbol = Symbol();
//A variable whose type is a 'unique symbol' type must be 'const'.
const sym2 = Symbol()
// 正常に動作します。見かけ上ユニークなシンボルを指しているが、そのアイデンティティは'sym1'に結びついています。
let sym3: typeof sym2 = sym2;
console.log(sym3 === sym2);//true
// こちらも正常に動作します。
class C {
static readonly StaticSymbol: unique symbol = Symbol();
}
参考
参考になる記事を書いてくださった皆様ありがとうございました!
宣伝させてください!