打字稿:使用let(最佳实践)

alb*_*ert 4 javascript typescript

我正在使用TypeScript而且我是新用的,所以我有一个关于声明变量的问题.

当我们声明我们使用的变量时let name: type = value.好的,我总是分配变量的类型:如果我想要一个我声明的字符串string,与布尔值和数字相同.我看到了any制作任何类型变量的类型.

问题是:如果我将变量声明为数字,是否需要使用let myNumber: number = 23;?有必要说类型是一个数字?

如果我不这样做,并做一个typeOf(myNumber)它返回数字,但对于TypeScript是number或是any

最好的做法是在为变量赋值时始终设置类型,或者它不重要?

Sef*_*efe 5

Typescript将避免生成类型的变量any.当您将选项设置noImplicityAnytrue您的tsconfig.json,它甚至会给予你的时候你没有指定类型,打字稿只能设置类型的错误any.

一般来说,当您let在示例中指定类型时...

let myNumber: number = 23;
Run Code Online (Sandbox Code Playgroud)

...你明确地设置了类型.这意味着你清楚地传达了你制作这个变量的意图number.分配非数字值时,您将收到错误.使用显式类型声明所有变量没有任何问题,因为这只会提高代码的清晰度.

另一种选择是隐式输入变量.只有在声明时为变量赋值时才能执行此操作:

let myNumber = 23;
Run Code Online (Sandbox Code Playgroud)

由于您为变量指定了数字文字,因此Typescript可以推断变量的类型,并将其视为数字.在某些情况下,覆盖推理是有用的,例如对于联合类型:

let myNumberOrText: number | string = 23;
Run Code Online (Sandbox Code Playgroud)

当你noImplicitAny设置true为时,隐式输入any被禁止.所以...

let myAny = { FirstName: "John", LastName: "Doe" };
Run Code Online (Sandbox Code Playgroud)

...会导致错误,因为它会隐式输入any.仍然允许显式版本.所以你可以写...

let myAny: any = { FirstName: "John", LastName: "Doe" };
Run Code Online (Sandbox Code Playgroud)

...虽然在Typescript中你最好声明一个类或接口并用它来输入(假设你已经声明了一个类型Person):

let myPerson: Person = { FirstName: "John", LastName: "Doe" };
Run Code Online (Sandbox Code Playgroud)

Typescript的重点是向JavaScript引入静态类型.如果使用类型声明变量any,则静态类型没有任何优势,您可以使用纯JavaScript.