繁体   English   中英

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

[英]Typescript: checking truthiness of variable doesn't type-guard against undefined?

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()需要一个数字。 为什么这不会引发错误?

这个问题是众所周知的。 您可能会从此评论中了解类型检查器内部真正发生的事情:

核心问题是 fooAnchor 的窄化类型并不能真正说出来。 它的未缩小类型是 Partial<FooAnchorMap>[keyof TMap],它不是一个联合,我们可以从中删除 undefined 和 null 以生成可证明可分配给 HTMLElement 的其他类型。

工作正在进行中来解决它。 但是到目前为止,您只剩下解决方法了。

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);
    }
}

游乐场链接

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

undefined的位是红鲱鱼; 这只是被标记,因为strictNullChecks已启用,这意味着除非您声明

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

作为

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

每当您传递任何可能解析为undefined的内容时,它都会抱怨。 禁用strictNullChecks将消除该错误(尽管向其他人提供上述代码); 或者保证在传入之前处理undefined (例如?? 0 )也可以。

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

如果val?? 0 val?? 0不能解析为数字并且log()需要一个数字,即在您描述的场景中传入了一个真实的非数字。这对我来说在操场上失败了,你有一个不工作的例子?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM