feat: ユーザー定義型
データ構造(≒obj)に型名などを付けられるようにして、統一的にデータの種類を区別する方法があると嬉しい。現状でも識別用のプロパティを用意すれば可能だが、別用途のものと衝突する可能性がある。
利点
- 異なるデータ構造を統一的な方法で識別できる
- プリミティブ型を増やす必要性が減る
問題点
- 既存仕様との兼ね合いが難しい。
関連
- #66
- #75
衝突の心配なしにデータを区別したいという目的であればJavaScriptにおけるSymbol的なものを実装するという手もある
衝突の心配なしにデータを区別したいという目的であればJavaScriptにおけるSymbol的なものを実装するという手もある
個々のデータではなくデータの構造の種類を区別したいという話だと思うので、ちょっとズレるような?
{
type: Symbol("aaa")
foo: "bar"
}
みたいなのを考えてた
その方法では
現状でも識別用のプロパティを用意すれば可能だが、別用途のものと衝突する可能性がある。
これが解決できないと思います
Symbolだと衝突しないわね
let a1 = Symbol("aaa")
let a2 = Symbol("aaa")
a1 == a2 // false
Symbolだと衝突しないわね
プロパティ名が文字列のままなので、typeというプロパティ名を他で使いたい事情があった時に困ります
プロパティ名自体をsymbolにするとか
ちなみに動機としては、
- 今のDate系はただのnumを扱っていて分かりにくいからこういったものをラッピングできると嬉しい。
- でもプリミティブ型を次々増やすのよくない気がする。
といったところです。
プロパティ名自体をsymbolにするとか
これは一つの手ですね
Symbol:typeみたいな定数を用意してCore:typeはobj[Symbol:type]を参照する、というような実装も考えられます
実装が比較的楽な代わりにユーザー側に分かりづらい気もしますが…
objかどうかを区別するためにCore:typeは変えない方がいいと思います。
objだけを対象にするならjs側でプロパティを増やしてObj:type(obj), Obj:set_type(obj, name)とする方法も可能?
型アノテーションに書けなかったりメソッドを定義できなかったりするので、素直にclassみたいなものを書けるようにした方が最終的にシンプルになるように思います。
オブジェクト志向ができれば全て解決するのはそれはそう
インスタンス化可能な構造の宣言機能ですかね
型名付きオブジェクトとか objの内部表現に型の一意なIDを持たせて、型名からIDに解決できるようにすれば、型が一致するかのチェックに利用できそうです。 クラスのようなフィールドを宣言するようなものよりは緩く、手軽に利用できると思います。
インスタンス化可能な構造の宣言機能
型が一致するかのチェック
この2つはクラスで同時に実現できますが、本来別々の需要なので別々の機能として追加したさはありますね (まあ前者に関してはファクトリー関数で用が足りるといえばそうではあるのですが)
それはそれとして従属関係を示すためにOOPを使いたい時もあります