我是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
方法的参数隐式转换为字符串吗?
答案 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”)-“字符串”