繁体   English   中英

打字稿泛型:“T”和“数字”类型没有重叠错误

[英]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.

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