在寻找如何在TypeScript中测试类型相等性时,我发现了这个SO问题,它的标题看起来很有前途,但实际上问题并不是关于测试类型相等性的。
我想要一个可以测试两种类型等价性的东西:
type IsEqual<Type1, Type2> = ???;
比如,它可以用来确定重载函数的返回类型:
type IsAmbiguous<T> = T extends { isString: infer K } ? IsEqual<K,boolean> extends true ? T : never : never;
function doThing(val: number, opts: { isString: true }): string;
function doThing(val: number, opts: { isString: false }): number;
function doThing<T>(val: number, opts: IsAmbiguous<T>): string | number;
前两个重载函数从传入选项的狭窄类型中预测返回类型。而在第三个重载函数中,opts
可以通过变量传递,此时 isString
的类型为布尔值,并且返回类型将由 doThing
实现在运行时确定,但是 TypeScript 编译器可能无法在编译时知道(或不知道)。
IsEqual 的实现是什么?
type result = IsEqual<{ readonly a: 'A' }, { a: 'A' }>;
这里的result
是true,这是你的意图吗? - undefined