recordの子要素の型を指定する
ユースケース
code:ts
const sortBy = <T>(predicate: (a: T) => any = a => a) => (a: T, b: T) =>
predicate(a) > predicate(b) ? 1 : predicate(b) > predicate(a) ? -1 : 0;
このanyをやめたい
ここのanyは、
T型がObjectの場合は、その子要素の型
孫も含む
T型がprimitive型の場合は、そのまま
あ、これ普通にnumberでいいのかmrsekut.icon
だめだこういうのがありうる
code:ts
monitors.sort(sortBy(c => moment(c.publishStartAt)));
このままではこういう変な使い方ができてしまう
code:ts
例えば、こういう型を作ればましになる
code:ts
type Values<T> = T extends { key: string: infer U } ? U : T; const a = { hoge: 1, piyo: 'hoge', fuga: true } as const;
type A = Values<typeof a>; // 1|'hoge'|true
code:ts
const sortBy =
<T>(predicate: (a: T) => Values<T>) =>
(a: T, b: T) =>
predicate(a) > predicate(b) ? 1 : predicate(b) > predicate(a) ? -1 : 0;