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

标签 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 中没有类型。但是,当方法参数接受字符串参数时, typescript 不应该将传递给 testArgs 方法的参数隐式转换为字符串吗?

最佳答案

请务必记住,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);
}

关于javascript - TypeScript 中方法参数的隐式类型转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56741546/

相关文章:

javascript - Mongo : find returns nothing, 也没有错误

javascript - 如何使用 wrapInner() 将特定内容包装在 ah html 标签内?

Angular 2 : focusing input causes 'expression has changed after it was changed' error

javascript - TypeScript - 如何覆盖 lib.d.ts 中的声明?

javascript - extjs同一列的两种对齐方式

javascript - 如何使用 getAllResponseHeaders 方法创建一个 JSON 对象

javascript - 如何正确使用 Redis 与 Koa (node.js)

Javascript Promise 解决混淆

typescript - 链接静态 .plugin() 类方法以多次扩展实例 API

angular - 即使成功,如何避免 "ERROR: Spec method has no expectations"?