Skip to content

Commit 70ca60d

Browse files
committed
fix(propEq): improve propEq typings
* remove unnecessary constraint from propEq value: the function should receive any type values of object, no matter what parameter it received; * add additional types to use with placeholder
1 parent 1a36036 commit 70ca60d

File tree

3 files changed

+47
-17
lines changed

3 files changed

+47
-17
lines changed

test/anyPass.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ expectType<boolean>(
2525
})
2626
);
2727

28-
expectError(
28+
expectType<boolean>(
2929
isVampire({
3030
age: 21,
3131
garlic_allergy: true,

test/propEq.test.ts

Lines changed: 24 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { expectError, expectType } from 'tsd';
22

3-
import { propEq } from '../es';
3+
import {__, propEq} from '../es';
44

55
type Obj = {
66
union: 'foo' | 'bar';
@@ -12,28 +12,41 @@ type Obj = {
1212

1313
// propEq(val, name, obj)
1414
expectType<boolean>(propEq('foo', 'union', {} as Obj));
15-
// non-union string fails
16-
expectError(propEq('nope', 'union', {} as Obj));
17-
// completely different type fails
18-
expectError(propEq(2, 'union', {} as Obj));
15+
// propEq doesn't create unnecessary values constraint for object
16+
expectType<boolean>(propEq(1, 'union', {} as Obj));
17+
// unknown field names fails
18+
expectError(propEq('foo', 'unknown', {} as Obj));
1919

2020
// propEq(val)(name)(obj)
2121
expectType<boolean>(propEq('foo')('union')({} as Obj));
2222
// 'nope' is inferred as 'string' here.
2323
expectType<boolean>(propEq('nope')('union')({} as Obj));
24-
// completely different type fails
25-
expectError(propEq(2)('union')({} as Obj));
24+
// unknown field names fails
25+
expectError(propEq('foo')('unknown')({} as Obj));
2626

2727
// propEq(val)(name), obj)
2828
expectType<boolean>(propEq('foo')('union', {} as Obj));
2929
// 'nope' is inferred as 'string' here.
3030
expectType<boolean>(propEq('nope')('union', {} as Obj));
31-
// completely different type fails
32-
expectError(propEq(2)('union', {} as Obj));
31+
// unknown field names fails
32+
expectError(propEq('foo')('unknown', {} as Obj));
3333

3434
// propEq(val, name)(obj)
3535
expectType<boolean>(propEq('foo', 'union')({} as Obj));
3636
// 'nope' is inferred as 'string' here.
3737
expectType<boolean>(propEq('nope', 'union')({} as Obj));
38-
// completely different type fails
39-
expectError(propEq(2, 'union')({} as Obj));
38+
// unknown field names fails
39+
expectError(propEq('foo', 'unknown')({} as Obj));
40+
41+
// propEq(__, name, obj)(val)
42+
expectType<boolean>(propEq(__, 'union', {} as Obj)('foo'));
43+
// propEq(val, __, obj)(val)
44+
expectType<boolean>(propEq('foo', __, {} as Obj)('union'));
45+
// propEq(__, __, obj)(val, name)
46+
expectType<boolean>(propEq(__, __, {} as Obj)('foo', 'union'));
47+
// propEq(__, __, obj)(val)(name)
48+
expectType<boolean>(propEq(__, __, {} as Obj)('foo')('union'));
49+
50+
expectError(propEq('foo', __, {} as Obj)('unknown'));
51+
expectError(propEq(__, __, {} as Obj)('foo', 'unknown'));
52+
expectError(propEq(__, __, {} as Obj)('foo')('unknown'));

types/propEq.d.ts

Lines changed: 22 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,23 @@
1-
export function propEq<T>(val: T): {
2-
<K extends PropertyKey>(name: K): (obj: Record<K, T>) => boolean;
3-
<K extends PropertyKey>(name: K, obj: Record<K, T>): boolean;
1+
import { Placeholder } from 'ramda';
2+
3+
export function propEq(__: Placeholder): never;
4+
export function propEq<V>(val: V): {
5+
<K extends PropertyKey>(name: K): (obj: Record<K, any>) => boolean;
6+
<U extends Record<PropertyKey, any>>(__: Placeholder, obj: U): (name: keyof U) => boolean;
7+
<K extends keyof U, U extends Record<PropertyKey, any>>(name: K, obj: U): boolean;
48
};
5-
export function propEq<T, K extends PropertyKey>(val: T, name: K): (obj: Record<K, T>) => boolean;
6-
export function propEq<K extends keyof U, U>(val: U[K], name: K, obj: U): boolean;
9+
export function propEq<K extends PropertyKey>(__: Placeholder, name: K): {
10+
(__: Placeholder, obj: Record<K, any>): <V>(val: V) => boolean;
11+
<V>(val: V, obj: Record<K, any>): boolean
12+
<V>(val: V): (obj: Record<K, any>) => boolean
13+
};
14+
export function propEq<V, K extends PropertyKey>(val: V, name: K): (obj: Record<K, any>) => boolean;
15+
16+
17+
export function propEq<U extends Record<any, any>>(__: Placeholder, ___: Placeholder, obj: U): {
18+
<V extends Exclude<any, Placeholder>>(val: V, name: keyof U): boolean;
19+
<V extends Exclude<any, Placeholder>>(val: V): (name: keyof U) => boolean;
20+
};
21+
export function propEq<K extends PropertyKey>(__: Placeholder, name: K, obj: Record<K, any>): <V>(val: V) => boolean;
22+
export function propEq<V, U extends Record<any, any>>(val: V, __: Placeholder, obj: U): (name: keyof U) => boolean;
23+
export function propEq<U extends Record<any, any>>(val: Exclude<any, Placeholder>, name: keyof U, obj: U): boolean;

0 commit comments

Comments
 (0)