【问题标题】:Does Typescript allow to assign "any" to every other type? How to deal with catch(err: any)?Typescript 是否允许将“任何”分配给其他所有类型?如何处理捕获(错误:任何)?
【发布时间】:2020-10-01 16:26:21
【问题描述】:

我记得在文档中读到所有类型都可以分配给any。但我不记得读过any 可以分配给其他所有类型。

function takesAString(x: string) {
    console.log(x);
}

const xAny: any = {}

takesAString(xAny);   // <--- WHY IS THIS NOT AN ERROR ?
takesAString(true);
takesAString(111);

我在try-catch 循环中遇到了这个问题:

catch(err) {                    // TYPESCRIPT EVALUATES err AS any
  dispatch(SOME_ACTION(err));   // THIS EXPECTS err TO BE OF TYPE STRING
}

Typescript 将 catch 块 err 参数隐式评估为 any,并没有提醒我 SOME_ACTION(err) 可能没有按预期获得 string

这是正常行为吗?如何处理?

【问题讨论】:

标签: typescript error-handling try-catch typescript-typings


【解决方案1】:

这不是错误,因为 any 特别选择退出类型检查。来自the documentation

任何

在某些情况下,并非所有类型信息都可用,或者其声明会花费不适当的努力。这些可能发生在没有 TypeScript 或 3rd 方库的情况下编写的代码中的值。 在这些情况下,我们可能希望退出类型检查。为此,我们使用any 类型标记这些值 ...

(我的重点)

将此与unknown type 对比(我认为它相对较新),您在代码中标记的行确实是错误:

const xUnknown: unknown = {}

takesAString(xUnknown);   // <--- This is an error

Playground link

【讨论】:

    【解决方案2】:

    您想使用new feature to label catch variable as unknown

    try {
      // ...
    }catch(err: unknown) {   // no longer typed as any
      dispatch(SOME_ACTION(err));   // this is correctly error now.
    }
    

    【讨论】:

    • 为什么投反对票? OP 显然在询问如何处理将错误值键入为 any 而这就是您如何将其改为 unknown
    猜你喜欢
    • 2017-09-08
    • 2018-08-16
    • 2020-04-15
    • 1970-01-01
    • 2019-07-25
    • 1970-01-01
    • 1970-01-01
    • 2011-07-30
    • 1970-01-01
    相关资源
    最近更新 更多