Skip to content

Commit 9f797b0

Browse files
Loosen type constraints for deepEqual assertion
Allow actual to extend expected, or for the types to not extend each other at all.
1 parent b5f934d commit 9f797b0

File tree

2 files changed

+42
-0
lines changed

2 files changed

+42
-0
lines changed

test-d/deep-equal.ts

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
import {expectType} from 'tsd';
2+
3+
import test from '..';
4+
5+
test('actual extends expected', t => {
6+
type Expected = {foo: [1, 2, 3]};
7+
const expected: Expected = {foo: [1, 2, 3]};
8+
const actual = {foo: [1, 2, 3]};
9+
if (t.deepEqual(actual, expected)) {
10+
expectType<Expected>(actual);
11+
}
12+
});
13+
14+
test('expected extends actual', t => {
15+
type Expected = {foo: Array<number | string>};
16+
type Actual = {foo: number[]};
17+
const expected: Expected = {foo: [1, 2, 3]};
18+
const actual: Actual = {foo: [1, 2, 3]};
19+
if (t.deepEqual(actual, expected)) {
20+
expectType<Actual>(expected);
21+
}
22+
});
23+
24+
test('neither extends the each other', t => {
25+
type Expected = {readonly foo: readonly [1, 2, 3]};
26+
type Actual = {foo: number[]};
27+
const expected: Expected = {foo: [1, 2, 3]};
28+
const actual: Actual = {foo: [1, 2, 3]};
29+
t.deepEqual(actual, expected);
30+
});

types/assertions.d.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,18 @@ export interface DeepEqualAssertion {
138138
*/
139139
<Actual, Expected extends Actual>(actual: Actual, expected: Expected, message?: string): actual is Expected;
140140

141+
/**
142+
* Assert that `actual` is [deeply equal](https://github.com/concordancejs/concordance#comparison-details) to
143+
* `expected`, returning a boolean indicating whether the assertion passed.
144+
*/
145+
<Actual extends Expected, Expected>(actual: Actual, expected: Expected, message?: string): expected is Actual;
146+
147+
/**
148+
* Assert that `actual` is [deeply equal](https://github.com/concordancejs/concordance#comparison-details) to
149+
* `expected`, returning a boolean indicating whether the assertion passed.
150+
*/
151+
<Actual, Expected>(actual: Actual, expected: Expected, message?: string): boolean;
152+
141153
/** Skip this assertion. */
142154
skip(actual: any, expected: any, message?: string): void;
143155
}

0 commit comments

Comments
 (0)