问题描述
从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说:
因为您假设任何
A
是A<T>
,即使事实并非如此。
但是我觉得它实际上是相反的。 A<number>
是A
(不是A
和A<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 (将#修改为@)