Open2
TypeScriptで型を良い感じに処理
Record<string, string>
のkeyとvalueを逆転させて、型も保持する
const invertDict = <T extends Record<string, string>>(dict: T) =>
Object.keys(dict).reduce((obj, key) => {
obj[dict[key as keyof T]] = key;
return obj;
}, {} as Record<string, string>) as { [k in keyof T as T[k]]: k };
const original = { key1: "value1", key2: "value2" } as const;
// type {
// readonly value1: "key1";
// readonly value2: "key2";
//}
const inverted = invertDict(original);
になる
objectの指定した一部のプロパティだけRequiredにする
// TがUnionでも対応できるようにunion distributionを起こしている
type RequiredByKeys<T, K extends keyof T = keyof T> = T extends T
? Required<Pick<T, K>> & Omit<T, K>
: never;
メインは Required<Pick<T, K>> & Omit<T, K>
だけど、
Tがunionの場合は使えないのでT extends T ?
でunion distributionを起こしている