Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Update: keys related functions #50

Merged
merged 8 commits into from
Jul 8, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 20 additions & 0 deletions test/fromPairs.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
import { expectType } from 'tsd';

import { fromPairs, toPairs } from '../es';

const symbolKey = Symbol('key');

// literals
expectType<{ foo: number; bar: number; }>(fromPairs([['foo', 1], ['bar', 2]]));
// typed
expectType<{ foo: number; bar: number; 0: number; [symbolKey]: number; }>(fromPairs([] as ['foo' | 'bar' | 0 | typeof symbolKey, number][]));
// keys that are not a union of values produced an index signature type
expectType<{ [x: string]: number }>(fromPairs([] as [string, number][]));
// 'foo' | 'bar' | string collapses to string, this is expected
expectType<{ [x: string]: number }>(fromPairs([] as ['foo' | 'bar' | string, number][]));

// should be able to go fromPairs -> toPairs and get original type back
const pairs: (['foo', number] | ['bar', number])[] = [['foo', 1], ['bar', 2]];
const obj = fromPairs(pairs);
const backAgain = toPairs(obj);
expectType<(['foo', number] | ['bar', number])[]>(backAgain);
20 changes: 20 additions & 0 deletions test/keys.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
import { expectType } from 'tsd';

import { keys } from '../es';

type Obj = {
foo: string;
bar: string;
};

// empty object literal
expectType<never[]>(keys({}));
// type literal
expectType<('foo' | 'bar')[]>(keys({ foo: '', bar: '' }));
// typed object
expectType<('foo' | 'bar')[]>(keys({} as Obj));
// index signatures
// for whatever reason, `keyof { [key: string]: string; }` returns `(string | number)[]`
expectType<(string | number)[]>(keys({} as { [key: string]: string; }));
// Record
expectType<string[]>(keys({} as Record<string, string>));
21 changes: 21 additions & 0 deletions test/toPairs.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
import { expectType } from 'tsd';

import { fromPairs, toPairs } from '../es';

type Obj = { 0: number; foo: string; bar: string; [symbolKey]: boolean; };

const symbolKey = Symbol('key');
// literals
expectType<([0, number] | ['foo', string] | ['bar', string] | [typeof symbolKey, boolean])[]>(toPairs({} as { 0: number; foo: string; bar: string; [symbolKey]: boolean; }));
// typed
expectType<([0, number] | ['foo', string] | ['bar', string] | [typeof symbolKey, boolean])[]>(toPairs({} as Obj));
// indexed objects
expectType<[string, number][]>(toPairs({} as { [index: string]: number }));
// Record
expectType<[string, number][]>(toPairs({} as Record<string, number>));

// should be able to go toPair -> fromPair and get original type back
const obj: { foo: number; bar: number } = { foo: 1, bar: 2 };
const pairs = toPairs(obj);
const backAgain = fromPairs(pairs);
expectType<{ foo: number; bar: number }>(backAgain);
8 changes: 3 additions & 5 deletions types/fromPairs.d.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
import { KeyValuePair } from './util/tools';

export function fromPairs<V>(
pairs: ReadonlyArray<Readonly<KeyValuePair<string, V>>> | ReadonlyArray<Readonly<KeyValuePair<number, V>>>,
): { [index: string]: V };
export function fromPairs<K extends PropertyKey, V>(
pairs: readonly [K, V][]
): { [P in K]: V };
1 change: 0 additions & 1 deletion types/keys.d.ts
Original file line number Diff line number Diff line change
@@ -1,2 +1 @@
export function keys<T extends object>(x: T): Array<keyof T>;
export function keys<T>(x: T): string[];
5 changes: 1 addition & 4 deletions types/toPairs.d.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1 @@
export function toPairs<O extends object, K extends Extract<keyof O, string | number>>(
obj: O,
): Array<{ [key in K]: [`${key}`, O[key]] }[K]>;
export function toPairs<S>(obj: Record<string | number, S>): Array<[string, S]>;
export function toPairs<O extends object>(obj: O): Array<{ [key in keyof O]: [key, O[key]] }[keyof O]>;
5 changes: 1 addition & 4 deletions types/toPairsIn.d.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1 @@
export function toPairsIn<O extends object, K extends Extract<keyof O, string | number>>(
obj: O,
): Array<{ [key in K]: [`${key}`, O[key]] }[K]>;
export function toPairsIn<S>(obj: Record<string | number, S>): Array<[string, S]>;
export function toPairsIn<O extends object>(obj: O): Array<{ [key in keyof O]: [key, O[key]] }[keyof O]>;