with文の代わりにオブジェクトを省略する記法はありますか?
Q&A
Closed
解決したいこと
JavaScriptでTypeScriptのような型注釈を行なうプログラムを作っています。
TypeAnnotation
オブジェクトに各型注釈をObject.defineProperty()
で実装していますが、
一々TypeAnnotation
と記述するのが面倒でwith(TypeAnnotation) {...}
のように書いています。
このwith
文は非推奨な上に複雑なバグや互換性の問題があるようです。
下記コードは動作確認用のサンプルで、実際のコードでは、TypeAnnotation
は外部ファイル(.cjs)から読み込むようにしているので、
ta
などのように短縮してwith
を使用しないで記述しても良いのですが、
他に何か方法はありますでしょうか?
TypeScriptを使う以外でお願いします。
該当するソースコード
const TypeAnnotation = {};
Object.defineProperty(TypeAnnotation, "number", {
get() {
return 0;
},
set(value) {
if(typeof value !== "number")
throw new TypeError(`'${typeof value}' is not a 'number'`);
}
});
class Point {
constructor(x = 0, y = 0) {
this.x = x;
this.y = y;
}
}
try {
let props = null;
with(TypeAnnotation) {
props = {
num: number = 1,
ary: [number, number, number] = [0, 1, 2],
pnt: {
x: number,
y: number
} = new Point(100, 100)
};
}
with(props) {
console.table(num);
console.table(ary);
console.table(pnt);
}
} catch(e) {
console.log(e.message);
}
1
┌─────────┬────────┐
│ (index) │ Values │
├─────────┼────────┤
│ 0 │ 0 │
│ 1 │ 1 │
│ 2 │ 2 │
└─────────┴────────┘
┌─────────┬────────┐
│ (index) │ Values │
├─────────┼────────┤
│ x │ 100 │
│ y │ 100 │
└─────────┴────────┘
自分で試したこと
プロパティを使用しているコードを関数で囲って、
call(オブジェクト)
で呼んだりしましたが、
関数内で頭にthis.
をつけないと利用出来ませんでした。
const TypeAnnotation = {};
Object.defineProperty(TypeAnnotation, "number", {
get() {
return 0;
},
set(value) {
if(typeof value !== "number")
throw new TypeError(`'${typeof value}' is not a 'number'`);
}
});
class Point {
constructor(x = 0, y = 0) {
this.x = x;
this.y = y;
}
}
try {
let props = null;
(function() {
props = {
num: this.number,
ary: [this.number, this.number, this.number] = [3, 4, 5],
pnt: {
x: this.number,
y: this.number
} = new Point()
};
}).call(TypeAnnotation);
(function() {
console.table(this.num);
console.table(this.ary);
console.table(this.pnt);
}).call(props);
} catch(e) {
console.log(e.message);
}
0
┌─────────┬────────┐
│ (index) │ Values │
├─────────┼────────┤
│ 0 │ 3 │
│ 1 │ 4 │
│ 2 │ 5 │
└─────────┴────────┘
┌─────────┬────────┐
│ (index) │ Values │
├─────────┼────────┤
│ x │ 0 │
│ y │ 0 │
└─────────┴────────┘