如何防止Typescript中的函数调用隐式转换为“ any”

时间:2018-11-19 08:46:16

标签: typescript tslint

考虑以下打字稿代码:

[]

是否可以通过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了,但是我已经被一些本可以避免的问题困扰了。

1 个答案:

答案 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泄漏。