如何解决为什么`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说:
因为您假设任何
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 举报,一经查实,本站将立刻删除。