【问题标题】:How to prevent implicit conversion from 'any' on function call in Typescript如何防止在 Typescript 中的函数调用上从“任何”进行隐式转换
【发布时间】:2019-04-21 14:25:17
【问题描述】:

考虑以下打字稿代码:

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

有没有办法通过 tsconfig 或 tslint 选项或其他方式阻止函数 eatString(str: string) 采用 any 参数?

我最初认为noImplicitAny 可能会有所帮助,但在尝试并查看文档之后,这并不是我的想法。 no-any 不适合我,因为在某些情况下我仍然希望能够使用 any

如果这是不可能的,我是否有一些原因我想知道为什么?我已经很久没有使用 typescript/javascript 工作了,但是我已经被一些本可以阻止的问题所困扰。

【问题讨论】:

标签: typescript tslint


【解决方案1】:

any 根据定义可分配给任何其他类型,因此当您将anyObject 传递给参数str 时,它将按照此规则兼容。

除非绝对必要,否则应避免使用any。如果你不知道你应该使用的类型unknown,它与其他没有保护或断言的类型不兼容(参见hereany的区别)

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 泄​​漏。

【讨论】:

  • 不知何故我错过了 unknown 类型,它与 tslint 的 no-any 结合解决了我的问题。最初我看到anyunknown 的真正含义,但我现在明白了。谢谢!
  • @valjean 很高兴为您提供帮助,如果有用,请不要忘记点赞并标记为已回答 :)
  • 就我而言,any 确实从外部库泄漏,我正在寻找一种方法来防止将其传递给函数。我处于严格模式并且 noImplicitAny 已打开,但仍然没有编译错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-09
  • 1970-01-01
  • 1970-01-01
  • 2018-02-28
  • 1970-01-01
  • 2020-12-30
相关资源
最近更新 更多