如何防止在 Typescript 中的函数调用上从“任何”进行隐式转换

Posted

技术标签:

【中文标题】如何防止在 Typescript 中的函数调用上从“任何”进行隐式转换【英文标题】:How to prevent implicit conversion from 'any' on function call in 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 工作了,但是我已经被一些本可以阻止的问题所困扰。

【问题讨论】:

any 的整体理念是它是一种可以无约束地表示任何 JavaScript 值的类型。 github.com/Microsoft/TypeScript/blob/master/doc/spec.md#3.1 【参考方案1】:

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

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

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 已打开,但仍然没有编译错误。

以上是关于如何防止在 Typescript 中的函数调用上从“任何”进行隐式转换的主要内容,如果未能解决你的问题,请参考以下文章

如何防止使用 TypeScript 在构造函数中未定义成员?

如何防止在水平滚动方向上从左到右滚动集合视图?

如何防止在同一台电脑上从麦克风到扬声器的回声

如何防止 C# 中的继承者调用基本构造函数?

如何在 C 中的 STM32 QEMU 调试器 eclipse 上从 RAM 内存执行函数?

Linux上从Java程序中调用C函数