Typescript 如何阻止从'any'隐式转换为更强的类型
TypeScript允许从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
任意
隐式转换为更强的类型。考虑到反序列化JSON的类型为any
,此行为允许出现许多类型错误和中断键入
我可以使用哪些编译器或linting选项来阻止从any
隐式转换为更强的类型
Repro此操作应标记为允许从任何
类型转换为更强类型
const o = JSON.parse("");
const s: string = o.twinlakes;
如果还没有,请尝试启用TypeScript编译器标志,以防止声明意外忘记标记无法推断的类型。这将停止代码,例如
let data
或函数将数据{/*…*/}
从允许其数据
变量“隐式”为typeany
此外,这里还有一些规则可以帮助您:
- :不允许使用
作为类型声明。使用此选项可停止声明中包含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,这意味着没有声明为typeany
。其参数没有给出显式类型定义的函数,例如函数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
类型)。我还想得到一些警告!