3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

unique symbolについて理解する

Last updated at Posted at 2023-09-17

目次

  1. 背景
  2. Symbolとは
  3. ユースケース
  4. unique symbolとは

1.背景

Branded Type について理解する
この記事の中でunique symbolキーワードが出てきた為です。

Symbols
こちらを和訳し内容をまとめていきます。

2.Symbolとは

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型を指定できません。
image.png

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(); // これはエラーになる

playground

  • 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();
}

playground

参考

参考になる記事を書いてくださった皆様ありがとうございました!

宣伝させてください!

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?