TypeScript中方法参数的隐式类型转换

时间:2019-06-24 17:44:06

标签: javascript typescript

我是TypeScript的新手。我遇到了这种情况:

function testArgs(arg: string) {
  console.log(typeof arg);
}

const arr = ['apple', 'banana', 'grapes'];

arr.forEach((rec, i) => {
   testArgs(i);
});

输出为:

number
number
number

我知道这是因为ts代码已转换为js,因此console.log打印number,因为js中没有类型。但是,当方法参数接受字符串参数时,打字稿不应该将传递给 testArgs 方法的参数隐式转换为字符串吗?

4 个答案:

答案 0 :(得分:3)

您正在获取索引(i)的类型,该数字是获取typeof rec所需的数字

const arr:string[] = ['apple', 'banana', 'grapes'];

arr.forEach((rec, i) => {
  this.testArgs(rec); // you need to call this
  console.log(typeof rec); //this is the one that will get the type of array element
  console.log(typeof i); // This is getting type of index not the array
});

答案 1 :(得分:2)

重要的是要记住,Typescript永远不会根据类型信息实际更改数据类型。这种理解来自类型的基本性质:它们在那里可以帮助您避免犯错误,它们在代码中没有扮演积极的角色。

话虽如此,Typescript可以随意或严格。它越严格,对您作为编码员的帮助就越大(反之,如果您有懒惰的习惯:P,它就越烦人)

我建议您在tsconfig.json中设置一些选项,这样可以捕获您的错误,并且您可以轻松地看到此问题:

"strict": true,
"noImplicitReturns": true,
"noImplicitAny": true,
"noImplicitThis": true,

结果是TypeScript会抛出一个编译错误,警告您该问题(问题在于您传递的是索引,而不是项目):

error TS2345: Argument of type 'number' is not assignable to parameter of type 'string'.

偶然地,请避免使用旧的foreach语法-这非常昂贵(为每个项目调用一个函数),并且可能导致混乱的代码流。

尝试以下方法:

for (const item of arr) {
    testArgs(item);
}

答案 2 :(得分:0)

如果您使用数字调用testArgs方法,它将不会将其转换为字符串 Typescript用于将javascript中的对象转换为类型,或者换句话说,为对象提供类型。它不是用于类型转换,基本上是将对象的类型转换为其他类型

答案 3 :(得分:0)

TypeScript中的数据类型仅用于确保我们传递正确的数据类型。编译后,它只是JavaScript,因此,当您对参数使用typeof时,无论您在TypeScript函数中用作数据类型是什么,JavaScript都会根据传递的实际值来评估类型。

testArgs(1)-“数字”
testArgs(“ 1”)-“字符串”