![](/img/trans.png)
[英]Is there a way to create a type-guard for nested key access in 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);
}
}
我得到:
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.