![](/img/trans.png)
[英]Typescript error This condition will always return 'true' since the types have no overlap
[英]Typescript generics: types 'T' and 'number' have no overlap error
考虑这个例子:
function foo<T>(t: T): boolean {
return t === 1;
}
我得到This condition will always return 'false' since the types 'T' and 'number' have no overlap.
.
如果我将其更改为:
function foo<T extends any>(t: T): boolean {
return t === 1;
}
我认为默认情况下T
可以是any
,那么为什么我需要extends any
? 没有extends any
,TS 期望T
是什么类型?
编辑,实际功能:
function cleanObj<T>(
obj: ObjectOf<T>,
): ObjectOf<T> {
const newObj = {};
for (const k of Object.keys(obj)) {
if (obj[k] !== null && typeof obj[k] !== 'undefined' && obj[k] !== false) {
newObj[k] = obj[k];
}
}
return newObj;
}
如果两个操作数的类型相同且包含相同的值,则三元等号运算符===
返回 true。 相比之下, "1" == 1
将返回 true。
由于您使用===
您也比较类型,这是number
换右手操作性1
。 然而,你的 T 不能只是一个数字,这就是编译器给你这个通知的原因。
可能的解决方案:
==
而不是===
部分摘自https://github.com/microsoft/TypeScript/issues/17445 :
考虑您的原始功能:
function compare<T>(obj: T): boolean {
return obj === 1;
}
如果允许将任何内容与T
进行比较,我们也可以这样写:
function compare<T>(obj: T): boolean {
return obj === 'some-string-thats-definitely-not-obj';
}
如果在 some if
使用该函数, if
可能会创建不会引发错误的无法访问的代码。
这就是为什么打字稿要求您明确告诉它T
可以是any
,由于上述原因,这显然是不安全的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.