为什么`instanceof`会导致TypeScript中的类型信息丢失?

问题描述

从GitHub上开始的对话中:

class A<T> {
  constructor(public value: T) {}
}

const wrap = <T,>(value: T) => {
  if (value instanceof A) {
    return value
  }

  return undefined;
};

返回值类型T & A<any>导致类型信息丢失

type testType1 = (A<number> & A<any>)['value']; // any

为什么不使用unkNown而不是any来填充交集?

type testType0 = (A<number> & A<unkNown>)['value']; // number

在GitHub上,Ryan说:

因为您假设任何AA<T>,即使事实并非如此。

但是我觉得它实际上是相反的。 A<number>A(不是AA<T>),因此我相信我们可以肯定地说返回值是A<number> & A<unkNown>

我不明白为什么不是这种情况。如果A<number>A<any|unkNown>,为什么我们不能安全地说返回值是A<number>

然后,我认为也应避免某些交叉,因为它们也可能导致间接元数据丢失

const a = wrap('hello')!;

const value = a.value; // any

IMO应该不会出现这种情况。因为我们确定永远不会发生这种情况,所以键入string不是object。这对于任何原始语言都是如此。想象一下,我们现在通过了工会:

const a = wrap('hello' as A<number> | string)!;

const value = a.value; // any again

但是我们可以肯定地说,其中至少有一个会通过,但是any再次引起了问题。 I wrote an emulation of instanceOf that aims to resolve all these points

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)