Typescript 如何阻止从'any'隐式转换为更强的类型

Typescript 如何阻止从'any'隐式转换为更强的类型,typescript,casting,tslint,any,Typescript,Casting,Tslint,Any,TypeScript允许从任意隐式转换为更强的类型。考虑到反序列化JSON的类型为any,此行为允许出现许多类型错误和中断键入 我可以使用哪些编译器或linting选项来阻止从any隐式转换为更强的类型 Repro此操作应标记为允许从任何类型转换为更强类型 const o = JSON.parse(""); const s: string = o.twinlakes; 如果还没有,请尝试启用TypeScript编译器标志,以防止声明意外忘记标记无法推断的类型。这将停止代码,例如let data

TypeScript允许从
任意
隐式转换为更强的类型。考虑到反序列化JSON的类型为
any
,此行为允许出现许多类型错误和中断键入

我可以使用哪些编译器或linting选项来阻止从
any
隐式转换为更强的类型

Repro此操作应标记为允许从
任何
类型转换为更强类型

const o = JSON.parse("");
const s: string = o.twinlakes;

如果还没有,请尝试启用TypeScript编译器标志,以防止声明意外忘记标记无法推断的类型。这将停止代码,例如
let data
函数将数据{/*…*/}
从允许其
数据
变量“隐式”为type
any

此外,这里还有一些规则可以帮助您:

  • :不允许使用
    any
    作为类型声明。使用此选项可停止声明中包含
    any
    ,例如
    let data:any={/*…*/}
  • :不允许以不安全的方式意外使用
    any
    。这与
    no any
    不同,因为您可能仍然在不知不觉中使用
    any
    类型:例如,
    let data=JSON.parse(“{}”)

并使用
unknown
任何您想使用的
any
我目前已经有了“tslint:recommended”和“tslint react”规则集。我只是显式地添加了“no safe any”,在将
any
对象的属性强制转换为
string
时,没有看到任何更改。我相信
tsconfig.json中的
noImplicitAny
已经阻止了
no-any
的用例
noImplicitAny
不会阻止使用
any
类型。它只阻止隐式的
any
s,这意味着没有声明为type
any
。其参数没有给出显式类型定义的函数,例如
函数foo(data){}
,是隐式的。上面的
let data:any
是明确的。我刚刚在原始问题中添加了一个repo case。我尝试将
no any
no safe any
添加到我的tslint规则中,但它没有标记任何代码。您的重新编写案例与
no safe any
的一些测试案例非常相似,因此它肯定应该标记它。这可能是TSLint错误(如果是,请在TSLint上提交一个问题!),或者是因为lint命令没有对文件进行lint。只要您选择使用
any
,就会出现这种行为。解决方案是为JSON数据创建一个类型。例如:
const o:Test=JSON.parse(“”
)。如果您真的不知道JSON数据的内容,那么必须编写代码来确定JSON内容。我不建议在整个项目中使用未知数据。是的,这就是这个问题的动机。我想使用一个自动系统来标记任何选择在我们的代码库中使用
any
的人。在您的示例中,Typescript和TSLint认为一切都很好,因为您显然想要使用
any
。(因为
JSON.parse()
显式地将
o
设置为
any
类型)。我还想得到一些警告!