我试着在this的基础上创建IsAny个泛型.

我的IsAny种通用型似乎很好用.

const testIsUnknown2: IsUnknown<any> = true; // problem here, must be false

但是当我把IsAny个普通的改成一个注释的时候,它又能正常工作了.那为什么会这样?因为我在这IsAny个泛型中看不到任何区别,但我的泛型似乎在其他泛型中不起作用.

// 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;

推荐答案

问题是你的isAny<any>分会得到boolean分,这意味着这两项作业(job)都会通过:

const testIsAny1: IsAny<any> = true;
const testIsAny2: IsAny<any> = false;

对于其他isAny个定义,testIsAny2个失败.

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

type IsAny<T> = unknown extends T ? ([T] extends [object] ? true :  false) : false;

TypeScript playground

Javascript相关问答推荐

为什么子组件没有在reaction中渲染?

JavaScript .Click()函数不起作用

在JavaScript中,如何将请求的回调函数的结果合并到运行的代码中?

我的glb文件没有加载到我的three.js文件中

在分区内迭代分区

将json数组项转换为js中的扁平

按钮未放置在html dis位置

从PWA中的内部存储读取文件

无法在nextjs应用程序中通过id从mongoDB删除'

如何在coCos2d-x中更正此错误

是什么导致了这种奇怪的水平间距错误(?)当通过JavaScript将列表项元素追加到无序列表时,是否在按钮之间?

如何将未排序的元素追加到数组的末尾?

为什么当我更新数据库时,我的所有组件都重新呈现?

从逗号和破折号分隔的给定字符串中查找所有有效的星期几

如果没有页面重新加载Angular ,innerHTML属性绑定不会更新

更新Redux存储中的对象数组

如何使用画布在另一个内部绘制一个较小但相同的形状,同时保持恒定的边界厚度?

为什么我看到的是回复,而不是我的文档?

如何正确地在ComponentWillUnmount中卸载状态以避免内存泄漏?

如何在Highlihte.js代码区旁边添加行号?