javascript - Typescript:检查变量的真实性不会对未定义进行类型防护吗?

标签 javascript typescript

class Base {}

function log(arg: number) {
    console.log(arg);
}

function fn<T extends typeof Base>(
    instance: Partial<InstanceType<T>>,
    key: keyof InstanceType<T>,
) {
    const val = instance[key];
    if (val) {
        log(val);
    }
}

TS Playground :https://www.typescriptlang.org/play?#code/MYGwhgzhAEBCkFNoG8C+AodAzArgO2ABcBLAez2hFIHMAKMAJ2oC5o8cBbAIwQYEoU6aMOjByEUiAQA6KnUbU+AbnQZs+ImQpY8AHgAq0BAA9CCPABMYhAJ4AHBKSxxEAPlpCRxPBEJgCCKwACowkYCC6AJI+fgH69ggGrq4ANJ7CANYINqxZNk7Q0b7+wAjxDklpAsjpouKE0ABu4dAAvNDexQEA2nkAuioiHc60zSDVtUNyo+HKtRgYQA

我得到:

Argument of type 'InstanceType<T>[keyof InstanceType<T>] | undefined' is not assignable to parameter of type 'number'.
  Type 'undefined' is not assignable to type 'number'.

if (val)不应该防范undefined吗?如果我将其更改为 log(val ?? 0),它就会起作用。

另外,我很惊讶 log(val ?? 0) 有效。 val 可能是一个非数字的真值,但 log() 需要一个数字。为什么这不会引发错误?

最佳答案

问题是well known 。您可以从此comment了解类型检查器内部到底发生了什么。 :

The core problem is that the narrowed type of fooAnchor is not really speakable. Its unnarrowed type is Partial<FooAnchorMap>[keyof TMap], which isn't a union that we can remove undefined and null from to produce some other type that would be provably-assignable to HTMLElement.

work in progress来解决它。但到目前为止,您只剩下解决方法了。

function fn<T extends typeof Base>(
    instance: Partial<InstanceType<T>>,
    key: keyof InstanceType<T>,
) {
    const val: InstanceType<T>[keyof InstanceType<T>] | undefined = instance[key];
    if (val) {
        log(val);
    }
}

playground link

您将得到正确的错误: Type 'InstanceType<T>[string]' is not assignable to type 'number'.

关于javascript - Typescript:检查变量的真实性不会对未定义进行类型防护吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67980758/

相关文章:

javascript - 如何让我的index.htm 文件包含其他html 文件

javascript - 如何拆分域名?

javascript - 小计未将更改后的值从数据库获取到输入框

javascript - KonvaJS - 在不使用偏移的情况下围绕光标旋转矩形

javascript - 如何在对数组进行分组后在数组中连接/插入项目?

javascript - 使用map方法对数组进行分组

angular - elasticsearch-browser 的 Typescript 类型定义

typescript - 有没有更好的方法在 TypeScript 中管道 Type Guard 函数?

javascript - TypeScript 和点符号访问对象

typescript - ASP.NET 核心项目 : How to keep Typescript from Compiling