|
| 1 | +// deno-lint-ignore-file no-explicit-any |
| 2 | +import { assertType, type IsExact } from "@std/testing/types"; |
| 3 | + |
| 4 | +import type { Equal, TypeChallengesEqual } from "./_testutil.ts"; |
| 5 | + |
| 6 | +declare class Foo<T> { |
| 7 | + declare private _: T; |
| 8 | +} |
| 9 | + |
| 10 | +Deno.test("IsExact gives false positive", () => { |
| 11 | + // all of the following should be false |
| 12 | + assertType<IsExact<() => void, (x?: number) => void>>(true); |
| 13 | + assertType<IsExact<Foo<{ x: 1; a?: 1 }>, Foo<{ x: 1; b?: 1 }>>>(true); |
| 14 | + assertType<IsExact<() => any, () => number>>(true); |
| 15 | + assertType<IsExact<Foo<any>, Foo<number>>>(true); |
| 16 | + assertType<IsExact<{ a: 1 }, { readonly a: 1 }>>(true); |
| 17 | +}); |
| 18 | + |
| 19 | +Deno.test("TypeChallengesEqual gives false positive", () => { |
| 20 | + // all of the following should be false |
| 21 | + assertType<TypeChallengesEqual<[...any[]], [...any[], any]>>(true); |
| 22 | + assertType<TypeChallengesEqual<[any, ...any[]], [any, ...any[], any]>>(true); |
| 23 | +}); |
| 24 | + |
| 25 | +Deno.test("Equal", async (t) => { |
| 26 | + await t.step( |
| 27 | + "should be correct in cases where IsExact gives false positive", |
| 28 | + () => { |
| 29 | + assertType<Equal<() => void, (x?: number) => void>>(false); |
| 30 | + assertType<Equal<Foo<{ x: 1; a?: 1 }>, Foo<{ x: 1; b?: 1 }>>>(false); |
| 31 | + assertType<Equal<() => any, () => number>>(false); |
| 32 | + assertType<Equal<Foo<any>, Foo<number>>>(false); |
| 33 | + assertType<Equal<{ a: 1 }, { readonly a: 1 }>>(false); |
| 34 | + }, |
| 35 | + ); |
| 36 | + await t.step( |
| 37 | + "should be correct in cases where TypeChallengesEqual gives false positive", |
| 38 | + () => { |
| 39 | + assertType<Equal<[...any[]], [...any[], any]>>(false); |
| 40 | + assertType<Equal<[any, ...any[]], [any, ...any[], any]>>(false); |
| 41 | + }, |
| 42 | + ); |
| 43 | +}); |
0 commit comments