考虑以下打字稿代码:
[]
是否可以通过tsconfig或tslint选项或其他方式阻止函数function eatString(str: string){
console.log(str);
}
const anyObject: any = {
junk: 3425234,
};
eatString(anyObject); // Compiles ok - by why?
eatString({something: "abc"}); // Doesn't compile - as expected
接受eatString(str: string)
参数?
最初,我认为any
可能会有所帮助,但是尝试并查看文档后,这并不是我的想法。 noImplicitAny
不是我的选择,因为在某些情况下我仍然希望能够使用no-any
。
如果这不可能,那么为什么我缺少某些原因吗?我已经很长时间没有使用typescript / javascript了,但是我已经被一些本可以避免的问题困扰了。
答案 0 :(得分:0)
any
可以分配给任何其他类型,因此,当您将anyObject
传递给参数str
时,它将遵循此规则。
除非绝对必要,否则应避免使用any
。如果您不知道该类型,则应使用unknown
,该类型与没有保护或断言的其他类型不兼容(有关any
的差异,请参见here)
function eatString(str: string){
console.log(str);
}
const anyObject: unknown = {
junk: 3425234,
};
eatString(anyObject); // error now
在这种特殊情况下,您应该让编译器推断anyObject
的类型
function eatString(str: string){
console.log(str);
}
const anyObject = { // inferred as { junk : number }
junk: 3425234,
};
eatString(anyObject); // error now
您可以使用tslint禁止any
用作类型注释(使用this rule),但是any
可能仍会从外部API泄漏。