以下の記事を読んでていきなり”unique symbol”型というところで行き詰まってしまって記事の要点まで行けず困っております
TypeScriptでMapped Typesを使ってきれいなインターフェースを作る話
そもそも”unique symbol”とは?ということで調べますと以下のような要点が得られました
- 「unique symbol」型も Symbol( )で生成する
- 「unique symbol」型はconstまたはstatic readonlyのフィールドでのみ利用可
- 「unique symbol」型同士の変数でも相互代入は不可
- 「unique symbol」型の変数が定義されるとそれが一種の型として定義空間に追加される(const mySym: unique symbol;とあると、一意な mySymという 「ユニークな型」が同時に宣言されるということ)
そしてもっとも知りたいところは、記事内で「イミュータブルなレコード(ImmutableRecord<Data>)を扱うempty関数とset関数を定義する」というくだりで、どうして以下のエイリアスでイミュータブルな型が出来るのかという点です
TypeScript
1declare const recordBrand: unique symbol; 2type ImmutableRecord<Data> = { 3 [recordBrand]: Data 4};
これであっても変更は可能と思います。なのでコードの主旨が汲み取れてないなとずっと悩んでおります
TypeScript
1let obj: ImmutableRecord<{name: string}> = { 2 [recordBrand]: {name: 'Mike'} 3} 4obj[recordBrand].name = 'John' 5console.log(obj[recordBrand].name) // 'John'
質問の要点としては「これはどこがイミュータブルなの?」ということなのですが。
またさらに記事内でこれに続くコードで、関数の実装を書いてみれば何か思いつくかと思いやってみたのですが、ここでも理解不足でset関数の正しい実装がわからず、こちらについても教えていただきたいです。
TypeScript
1function empty(): ImmutableRecord<{}>{ 2 return {[recordBrand]:{}} 3} 4function set<Data, Key extends string, Value>( 5 map: ImmutableRecord<Data>, 6 key: Key, 7 value: Value, 8): ImmutableRecord<Data & { 9 [K in Key]: Value 10}>{ 11 map.key = value 12 return map 13} 14// error message 15// Type 'ImmutableRecord<Data>' is not assignable to type 'ImmutableRecord<Data & { [K in Key]: Value; }>'
交差型であればいいのなら単にプロパティーを追加するだけ可と思い上のようにしたのですがこれではだめなのでしょうか?これでどうして返り値の型と一致しないエラーになるのでしょうか?
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/02/04 01:57