我尝试基于IsAny创建这泛型。
而且,我的IsAny泛型似乎运行良好。但是,当我在另一个泛型(IsUnknown)中使用它时,它就坏了:
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;发布于 2022-03-26 10:49:57
问题是您的isAny<any>生成boolean,这意味着这两个分配都将通过:
const testIsAny1: IsAny<any> = true;
const testIsAny2: IsAny<any> = false;对于另一个isAny定义,testIsAny2失败。
关于isAny的定义,它失败了,因为条件类型T extends object ? true : false返回any的两个选项。我找不到关于这方面的任何文档,但是您可以通过用方括号(文档)包围两边,以同样的方式修复它,从而防止条件类型在联合中分布:
type IsAny<T> = unknown extends T ? ([T] extends [object] ? true : false) : false;发布于 2022-03-26 10:52:38
问题实际上在于IsAny。
您已经注意到了true: IsAny<any>,然而,false: IsAny<any>也是!
您已经触及了条件类型的一个方面,这可能与直觉相反。
我将给出这个例子:
type Extends<T, U> = T extends U ? true : false;我们有:
Extends<'a', 'a' | 'b'> =:= true
Extends<'c', 'a' | 'b'> =:= false到目前为止没什么奇怪的。
令人惊讶的是:
Extends<'a' | 'c', 'a' | 'b'> =:= boolean当我们有T extends U ? …时,如果T的子类型是U的子类型,而T的子类型不是U的子类型,则结果类型是两个分支的联合。
https://stackoverflow.com/questions/71626970
复制相似问题