如何防止在 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
结合解决了我的问题。最初我看到any
是unknown
的真正含义,但我现在明白了。谢谢!
@valjean 很高兴为您提供帮助,如果有用,请不要忘记点赞并标记为已回答 :)
就我而言,any
确实从外部库泄漏,我正在寻找一种方法来防止将其传递给函数。我处于严格模式并且 noImplicitAny 已打开,但仍然没有编译错误。以上是关于如何防止在 Typescript 中的函数调用上从“任何”进行隐式转换的主要内容,如果未能解决你的问题,请参考以下文章
如何防止使用 TypeScript 在构造函数中未定义成员?