RoslynがC#を提供するものと同様に、tsc
が蒸散プロセスを開始する前に.ts
ファイルを変更/チェックしたいと思います。Typescriptのカスタムツール、transpiler、拡張子
これは静的型検査に便利です。例えば、適切かつ短いImmutable Record
実装は、それがFlowで行うことができるように、コンパイル時にコード変更/静的なチェックが必要です。
@Record(Person)
interface IPerson {
givenName: string;
familyName: string;
}
、その後、カスタムTSC transpilerはにコードを修正することができます:
interface IPersonParams {
givenName?: string;
familyName?: string;
}
@Record()
class Person {
private readonly __givenName;
private readonly __familyName;
constructor(init) {
this.__givenName = init.givenName;
this.__familyName = init.familyName;
}
get givenName() {
return this.__givenName;
}
get familyName() {
return this.__familyName;
}
update(update: IPersonParams) {
// ignore the bug when undefined param is passed
return new Person({
givenName: update.givenName || this.__givenName,
familyName: update.familyName || this.__familyName
});
}
}
特別なtsc watch
を実行するVisual StudioとVisual Studioコードでは、webpackバンドルやカスタムgulpタスクの一部としてではなく、カスタムコンパイルエラーがすぐに表示されます。 TypescriptのAPIがありますが、それはtsc
のVS/VS Code/Atom
でシームレスに動作するようにするにはどうすればいいですか?例
と
更新の目標は、単に
@Record(Person)
interface IPerson {
givenName: string;
familyName: string;
}
クラス
Person
が自動になり先に示したようにインターフェイスIPerson
に基づいて生成された書き込みすることです。オブジェクトをインスタンス化することが可能となります。
let instance = new Person({givenName: "Emma", familyName: "Watson"});
どれでも間違ったプロパティは、コンパイル・エラーが発生します:
let instance = new Person({nonExistedProperty: "Emma"}); //error
エラー:プロパティ 'nonExistedProperty' が存在しません。 in class Personコンストラクタ。
エラー:クラスPersonコンストラクタで 'givenName'プロパティが必要です。
エラー:プロパティ「FamilyNameでは、」Personクラスのコンストラクタに必要とされます。既存のオブジェクトは、部分的にすべてのプロパティが
let instance = new Person({givenName: "Emma", familyName: "Watson"});
読み取り専用ですlet instance = new Person({givenName: "Emma", familyName: "Watson"});
instance.Update({givenName: "Luise"});
instance.givenName === "Luise"; //TRUE;
instance.familyName === "Watson"; //TRUE;
更新されることができるはずです
instance.givenName = "John"; //error
エラー:プロパティ 'givenName属性が' 読み取り専用です。
Equals
方法が自動生成されます。ハッシュや他の何かをベースにすることもできますが、すばやく作業して詳細なチェックを行う必要があります。let instance1 = new Person({givenName: "Emma", familyName: "Watson"});
let instance2 = new Person({givenName: "Emma", familyName: "Watson"});
instance1.Equals(instance2); //TRUE
また、作成されたインスタンスを制御するための場所を持っているかもしれないし、同じパラメータを持つレコードが内部ディクショナリに存在する場合、それはちょうどこのオブジェクトへの参照を返します。
let instance1 = new Person({givenName: "Emma", familyName: "Watson"});
let instance2 = new Person({givenName: "Emma", familyName: "Watson"});
instance1 == instance2; //TRUE
instance1 === instance2; //TRUE
使用すると、1つまたは複数の使用例をお願いできますか? あなたのデコレータがあなたの想像通りに解釈されたとき、どのようにユーザーコードが見えるでしょうか?何が可能で、何が制限されるのでしょうか? – Benjamin
TypeScriptでインターフェイスに注釈を付けることができないという事実を覚えておいてください。ここでの回避策は、インターフェースの代わりにクラスを使うことです: 'interface A {} ... class B implements A {}' – Benjamin
@Benjamin問題はインターフェースの注釈より深いです。コンパイラは動的に作成されたオブジェクトを完全にチェックすることはできません。 Typescriptアノテーションは、動的に作成されたオブジェクトのみを許可しますが、静的ではありません。そのため、カスタム中間コンパイルツールが必要です。これは、コンパイラによってさらに完全にチェックされるクラス(静的)を作成することができます。 – Artru