JavaScriptでクラスっぽいの作るのをいろいろと試行錯誤してきたんですが、TypeScript良い感じのJavaScriptはいてくれるんでいいですね。
そんな中でこれどうにかなんないかなーって思ったことがあったので書いてみます。
TypeScript上ではコンパイル時に警告されるんですが、JavaScript化したあとでprivateフィールドにアクセスできなくなってほしいなぁと思ってます。
たとえば、TypeScriptでこんな感じでprivate fieldを定義します。
export class Person {
private name:string;
constructor (n:string){
this.name = n;
}
show(){
console.log(this.name);
}
}
このprivateなフィールドnameに外部からアクセスしようとすると警告がでます。
import person = module("Person");
var p:person.Person = new person.Person('John');
p.show();
console.log("direct access: " + p.name);
typescriptコンパイル時
$ tsc Main.ts
Main.ts(6,34): The property 'name' does not exist on value of type 'person.Person'
</code>
TypeScript上ではエラーがでても、jsとして利用するときにはアクセスできます。
<code>
$node Main.js
John
direct access: John
JavaScriptに変換後のPerson.jsは素直にこう出力されるんですが、privateなところは反映されないんですよね。
var Person = (function () {
function Person(n) {
this.name = n;
}
Person.prototype.show = function () {
console.log(this.name);
};
return Person;
})();
exports.Person = Person;
私の理想としては、こうなって欲しかった。
var Person = (function () {
var name;
function Person(n) {
name = n;
}
Person.prototype.show = function () {
console.log(name);
};
return Person;
})();
exports.Person = Person;
こうなれば、js上でもnameに直接アクセスすることはできなくなるので。
TypeScript上で利用できなくなっているのだからもちろんそれでいいんですけど、例えばJavaScriptライブラリをTypeScriptで書いて公開はJSライブラリとした場合に困ったりしないかなーなんて思ってます。
https://gist.github.com/civic/5097699
なんか間違ってたら教えてほしいなー。