在TypeScript和TSLint中注释分配给变量的函数

时间:2016-05-22 13:06:32

标签: typescript tslint

我有这三个功能,除了一些非常小的差异外几乎相同:

function toInt1(x: string): number { return parseInt(x, 10); }

const toInt2 = function (x: string): number { return parseInt(x, 10); };

const toInt3 = (x: string): number => parseInt(x, 10);

现在我是TypeScript的新手,但在JS领域,我更喜欢第三种,因为它最简洁,最具限制性(没有this,没有提升函数名称。)

然而,当我使用tslint这个规则时(表面上看似合理,但也许我错了......):

"typedef": [
  true,
  "call-signature",
  "parameter",
  "arrow-parameter",
  "property-declaration",
  "variable-declaration",
  "member-variable-declaration"
],

我收到有关toInt2toInt3

的错误
expected variable-declaration: 'toInt2' to have a typedef
expected variable-declaration: 'toInt3' to have a typedef

似乎我可以通过复制所有类型来修复它:

const toInt2: (x: string) => number = function (x: string): number { return parseInt(x, 10); };
const toInt3: (x: string) => number = (x: string): number => parseInt(x, 10);

然而,这非常冗长且没有吸引力。这真的是最好的做事方式吗?

1 个答案:

答案 0 :(得分:1)

转换器想要为每个名称(变量)分配一个类型。通常,它可以从赋值中找出(推断)此类型:

// const x: number = 10;
const x = 10; 
// const y: string = 'foo';
const y = 'foo';
// const z: (a: string) => number = (a: string) => parseInt(a);
const z = (a: string) => parseInt(a);

此规则'variable-declaration'确保您不要让转换器推断出类型,但您明确要为任何varletconst编写类型签名声明(据我在文档中看到)。这可以提高可读性(代码的读者知道每个变量的静态类型而无需进一步调查),但代价是为所有变量编写类型签名。

现在要解决这个问题,你有两个选择:

  1. 在适当情况下禁用规则inline
  2. 为此
  3. 撰写custom rule