我刚开始接typescript
,遇到了type inference
。
现在,根据指导老师的介绍,用type
初始化变量不是最佳实践,而是依靠type inference
进行初始化,但立即出现如下所示的错误
function add(n1: number, n2: number, showResult: boolean, phrase: string) {
const result = n1 + n2;
if (showResult) {
console.log(phrase + result);
}
return result;
}
let number1;
number1 = '5';
const number2 = 2.8;
add(number1, number2, printResult, resultPhrase);
从上面的代码片段中,它显然使string
跳过了类型检查,因此,如果我们不依赖type inference
而是显式设置类型,这会是一个更好的主意吗?如下面
let number1: number;
number1 = '5';
立即我们从上述代码中得到错误。下图是不信任type inference
的证明。
number1
的类型为any
,因为声明时未分配任何内容。不幸的是,any
可分配给任何东西-这就是为什么强烈建议不要使用它。带有
function add(n1: number,
如果调用add
,并且传递的第一个参数的类型为any
,它将进行编译。
为变量之后]分配另一个值>声明了变量不会更改类型-Typescript仍将其键入为any
。
为了避免犯此类错误,请确保在tsconfig中启用noImplicitAny
-当您尝试使用需要更特定类型的noImplicitAny
时,它将抛出错误。
其他有用的方法是使用any
而不是const
-对于let
,将始终自动推断类型。您可能偶尔需要注释比推断的类型更具体的类型,但是至少推断的类型将始终是特定的,而不是const
。 (any
应优先于const
而已)
如果您do
必须使用let
-这有时是必要的-然后在初始化时为其分配一个值(并且类型推断将起作用),或使用类似类型的注释let
以便正确键入,否则将为
let number1: number;
并会引起问题。
当变量最初没有分配任何东西时使用类型注释非常好。