使用Object.defineProperty

时间:2018-07-18 00:51:31

标签: typescript tsc

我有这样一个方便的构造:

export class LinkedQueue {

  private lookup = new Map<any, any>();
  private head = null as any;
  private tail = null as any;
  public length: number;

  constructor() {

    Object.defineProperty(this, 'length', {
      get: () => {
        return this.lookup.size;
      }
    });

  }

} 

请注意,如果我删除此行:

 public length: number;

它仍然可以编译,即使它可能不应该编译。所以我的问题是-有没有办法键入检查像这样动态创建的属性?我想如果它是一个像'length'这样的硬编码字符串,那将是可能的。

这是我的tsconfig.json设置:

{
  "compilerOptions": {
    "outDir":"dist",
    "allowJs": false,
    "pretty": true,
    "skipLibCheck": true,
    "declaration": true,
    "baseUrl": ".",
    "target": "es6",
    "module": "commonjs",
    "noImplicitAny": true,
    "removeComments": true,
    "allowUnreachableCode": true,
    "lib": [
      "es2015",
      "es2016",
      "es2017"
    ]
  },
  "compileOnSave": false,
  "exclude": [
    "test",
    "node_modules"
  ],
  "include": [
    "src"
  ]
}

1 个答案:

答案 0 :(得分:2)

未对

Object.defineProperty(this, 'length', {的类型进行this突变检查。

备用

您实际上可以定义可编译为同一事物的吸气剂

export class LinkedQueue {

  private lookup = new Map<any, any>();
  private head = null as any;
  private tail = null as any;

  constructor() {
  }

  get length() { 
    return this.lookup.size;
  } 

}