打字稿自定义工具,转换器,扩展名

Art*_*tru 7 compilation visual-studio typescript visual-studio-code

我想.tstsc开始转换过程之前更改/检查文件,类似于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 ,但是如何让它与tscin VS/VS Code/Atom?无缝协作


更新示例

目标只是写作

@Record(Person)
interface IPerson {  
  givenName: string;
  familyName: string;
}
Run Code Online (Sandbox Code Playgroud)
  1. 该类Person将基于接口自动生成IPerson,如前所示.

  2. 可以实例化对象:

    let instance = new Person({givenName: "Emma", familyName: "Watson"});

    任何不正确的属性都会引发编译错误:

    let instance = new Person({nonExistedProperty: "Emma"}); //error

    错误:类Person构造函数中不存在属性'nonExistedProperty';
    错误:类Person构造函数中需要属性'givenName';
    错误:类Person构造函数中需要属性'familyName';

  3. 现有对象应该能够部分更新

    let instance = new Person({givenName: "Emma", familyName: "Watson"}); instance.Update({givenName: "Luise"});

    instance.givenName === "Luise"; //TRUE;
    instance.familyName === "Watson"; //TRUE;

  4. 所有属性都是只读的

    let instance = new Person({givenName: "Emma", familyName: "Watson"}); instance.givenName = "John"; //error

    错误:属性'givenName'是只读的;

  5. 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

Ben*_*min 1

也许您可以通过使用 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)