Art*_*tru 7 compilation visual-studio typescript visual-studio-code
我想.ts
在tsc
开始转换过程之前更改/检查文件,类似于Roslyn为C#提供的文件.
这对静态类型检查很有用.例如,正确和简短的Immutable Record
实现需要在编译时进行代码更改/静态检查,因为可以使用Flow完成:
@Record(Person)
interface IPerson {
givenName: string;
familyName: string;
}
Run Code Online (Sandbox Code Playgroud)
然后自定义tsc转换器可以修改代码:
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
});
}
}
Run Code Online (Sandbox Code Playgroud)
很高兴立即看到自定义编译错误,因为它现在使用Visual Studio和Visual Studio代码完成,它运行特殊tsc watch
,而不是作为webpack捆绑或自定义gulp任务的一部分.有一个针对Typescript的API ,但是如何让它与tsc
in VS/VS Code/Atom
?无缝协作?
更新示例
目标只是写作
@Record(Person)
interface IPerson {
givenName: string;
familyName: string;
}
Run Code Online (Sandbox Code Playgroud)
该类Person
将基于接口自动生成IPerson
,如前所示.
可以实例化对象:
let instance = new Person({givenName: "Emma", familyName: "Watson"});
任何不正确的属性都会引发编译错误:
let instance = new Person({nonExistedProperty: "Emma"}); //error
错误:类Person构造函数中不存在属性'nonExistedProperty';
错误:类Person构造函数中需要属性'givenName';
错误:类Person构造函数中需要属性'familyName';
现有对象应该能够部分更新
let instance = new Person({givenName: "Emma", familyName: "Watson"});
instance.Update({givenName: "Luise"});
instance.givenName === "Luise"; //TRUE;
instance.familyName === "Watson"; //TRUE;
所有属性都是只读的
let instance = new Person({givenName: "Emma", familyName: "Watson"});
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
也许您可以通过使用 TypeScript 装饰器来实现您的目标,而不是编写自己的 TypeScript(预)处理器。
这个例子来自https://www.typescriptlang.org/docs/handbook/decorators.html:
@sealed
class Greeter {
greeting: string;
constructor(message: string) {
this.greeting = message;
}
greet() {
return "Hello, " + this.greeting;
}
}
function sealed(constructor: Function) {
Object.seal(constructor);
Object.seal(constructor.prototype);
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
217 次 |
最近记录: |