有一个编译器选项noImplicitAny
,它是这样描述的:
在某些不存在类型注释的情况下,当TypeScript无法推断变量的类型时,它将回退到
any
类型。这可能会导致遗漏一些错误,例如:
function fn(s) { // No error? console.log(s.subtr(3)); } fn(42);
打开
noImplicitAny
,但是只要TypeScript推断出any
:,它就会发出错误function fn(s) { /* ~ Parameter 's' implicitly has an 'any' type. */ console.log(s.subtr(3)); }
我想要的是将编译器配置为在上述情况下无法推断类型信息的情况下更严格地执行操作:我希望它在这些站点中的每一个使用unknown
(而不是any
(。还有另一个编译器选项useUnknownInCatchVariables
,它是这样描述的:
TypeScript 4.0中添加了支持,允许将catch子句中变量的类型从
any
更改为unknown
。允许类似以下代码:try { // ... } catch (err) { // We have to verify err is an // error before using it as one. if (err instanceof Error) { console.log(err.message); } }
这种模式确保错误处理代码变得更加全面,因为您不能提前保证抛出的对象是error子类。启用标志
useUnknownInCatchVariables
后,就不需要额外的语法(: unknown
(或linter规则来强制执行此行为。
但是,这仅适用于catch
子句中的exception
参数。
如何将编译器配置为在所有情况下都回退到unknown
?
目前,不可能启用这种隐含的更严格的类型安全,但在ms/TS#27265中建议使用implicitUnknown
选项。