首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于类型分配(兼容性)表的自定义IsAny和IsUnknown泛型

基于类型分配(兼容性)表的自定义IsAny和IsUnknown泛型
EN

Stack Overflow用户
提问于 2022-03-26 09:51:29
回答 2查看 64关注 0票数 4

我尝试基于IsAny创建泛型。

而且,我的IsAny泛型似乎运行良好。但是,当我在另一个泛型(IsUnknown)中使用它时,它就坏了:

代码语言:javascript
复制
const testIsUnknown2: IsUnknown<any> = true; // problem here, must be false

但是,当我将IsAny泛型改为注释一时,它再次正常工作。那为什么会发生这种事?因为我没有看到两个IsAny泛型之间有什么不同,但是我的泛型似乎在其他泛型中不起作用。

代码语言:javascript
复制
// type IsAny<T> = 0 extends (1 & T) ? true : false;

type IsAny<T> = unknown extends T ? (T extends object ? true : false) : false;
const testIsAny1: IsAny<any> = true;
const testIsAny2: IsAny<unknown> = false;
const testIsAny3: IsAny<string> = false;
const testIsAny4: IsAny<object> = false;

// unknown is only assignable to two types: unknown and any
type IsUnknown<T> = unknown extends T ? (IsAny<T> extends true ? false : true) : false;
const testIsUnknown1: IsUnknown<unknown> = true;
const testIsUnknown2: IsUnknown<any> = true; // problem here, must be false
const testIsUnknown3: IsUnknown<object> = false;
const testIsUnknown4: IsUnknown<number> = false;
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-03-26 10:49:57

问题是您的isAny<any>生成boolean,这意味着这两个分配都将通过:

代码语言:javascript
复制
const testIsAny1: IsAny<any> = true;
const testIsAny2: IsAny<any> = false;

对于另一个isAny定义,testIsAny2失败。

关于isAny的定义,它失败了,因为条件类型T extends object ? true : false返回any的两个选项。我找不到关于这方面的任何文档,但是您可以通过用方括号(文档)包围两边,以同样的方式修复它,从而防止条件类型在联合中分布:

代码语言:javascript
复制
type IsAny<T> = unknown extends T ? ([T] extends [object] ? true :  false) : false;

TypeScript游乐场

票数 3
EN

Stack Overflow用户

发布于 2022-03-26 10:52:38

问题实际上在于IsAny

您已经注意到了true: IsAny<any>,然而,false: IsAny<any>也是!

您已经触及了条件类型的一个方面,这可能与直觉相反。

我将给出这个例子:

代码语言:javascript
复制
type Extends<T, U> = T extends U ? true : false;

我们有:

代码语言:javascript
复制
Extends<'a', 'a' | 'b'> =:= true
Extends<'c', 'a' | 'b'> =:= false

到目前为止没什么奇怪的。

令人惊讶的是:

代码语言:javascript
复制
Extends<'a' | 'c', 'a' | 'b'> =:= boolean

当我们有T extends U ? …时,如果T的子类型是U的子类型,而T的子类型不是U的子类型,则结果类型是两个分支的联合。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71626970

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档