Datastoreからデータ取得時、Symbol(KEY)の中身を取得する方法(Node.js)

プログラミング

Datastoreからデータを取得時にSymbol(KEY)の中身を使いたかったのだが、このSymbolがどこに定義されてるのか探したので、メモ。

簡単にSymbolについて

  • プリミティブ型
  • Symbol() から返されるすべてのシンボル値は一意
  • コンストラクターとしての機能を持たず、new Symbol() はサポートされてない。
const sym1 = Symbol()
const sym2 = Symbol()

sym1 === sym2 // false

const sym3 = Symbol('foo')
const sym4 = Symbol('foo')

sym3 === sym4 // false

つまり、Symbol()する度にユニークなシンボル値をとる事になる。
(Symbol()の引数は、KEYというよりSymbolの説明である。)

使われ方としては、外部から使われたくないような隠れたオブジェクトプロパティとして、Symbolがキーにされることがある。
datastore.get() で取得されるオブジェクトのキーである Symbol(KEY)は隠れたプロパティとして使われている。なので、直接いじらない方がいい。。とはいえ、中身を取得したい。。

$ import { Datastore } from '@google-cloud/datastore';
$ const datastore = new Datastore();

$ const taskName = 'foo'
$ const taskKey = datastore.key(['Task', taskName]);
$ const [task] = await datastore.get(taskKey).then(([task]) => console.log(task));
# taskの中身
{ name: 'タスク名',
  [Symbol(KEY)]:
   Key {
     namespace: undefined,
     name: 'foo',
     kind: 'Task',
     path: [Getter] } 
}

Symbol(KEY)datastore.KEY として定義されている。
もちろん。Symbol(‘KEY’)ではダメ。

$ const kind = task[datastore.KEY].kind;
# kindの中身
'Task'