在惯用的Typescript中,我应该总是声明一个变量的类型,还是应该更多地依赖类型推断?

时间:2014-07-03 17:10:12

标签: typescript idiomatic

起初,我们的团队发现自己编写了大量这样的代码,因为这是我们在ActionScript等语言中习惯使用的。

var arrayOfFoo : Array<Foo> = new Array<Foo>();
//Then, sometime later:
var someFoo : Foo = arrayOfFoo[0];
someFoo.someFooMethod();

没关系,但可以通过更多地依赖于Typescript的类型推理来简化它:

//No need to declare the type ": Array<Foo>" here:
var arrayOfFoo = new Array<Foo>();

//Again, no need to declare that someFoo is a Foo
var someFoo = arrayOfFoo[0];
someFoo.someFooMethod();

Typescript在类型推断方面非常擅长。如果我从赋值的左侧删除类型,编译器仍然知道该对象是什么类型,并且如果我尝试对推断类型不能执行的变量执行某些操作,则仍会产生编译错误。

我喜欢它读取的代码更少,输入的代码更少。声明类型的示例开始感觉到&#34;冗余&#34;对我来说,但我担心我们可能会在以后为自己找麻烦。我很好奇社区推荐的内容,如果有的话。

1 个答案:

答案 0 :(得分:6)

我为我的项目所做的事情并不是在可以推断时将类型定义放在任何地方,因为(正如你已经说过的那样)它是多余的。

我目前没有做什么(但我真的想这样做)正在使用--noImplicitAny编译任何标志。

启用该标志后,您将收到一个错误,它无法推断出真正有用的类型!你可能想看一下!请参阅下面的示例。

使用tsc编译时,下面的代码会给出三个错误--noImplicitAny tst.ts:

var arr = [];
var x = null;
var a: string[] = [];
var s = a["foo"]

tst.ts(1,11):错误TS7015:Array Literal隐含有一个&#39; any&#39;来自扩大的类型。

tst.ts(2,5):错误TS7005:变量&#39; x&#39;隐含地有一个“任何”的类型。

tst.ts(5,11):错误TS7017:对象类型的索引签名隐含地具有&#39; any&#39;类型。

这种方式当你做一些奇怪的事情(意外)时会出错。