首页 > 解决方案 > 如何输入`mergeDeepRight`

问题描述

我有功能

const updateStoreMerge = (value: PartialRecursive<StoreType>): StoreType => updateStore(s => mergeDeepRight(s, value));

怎么打字?Value应该只是StoreType. 我想要像部分但递归地为所有属性设置可空性的东西。

type PropsThatAreObjects<T, K extends keyof T> = K extends keyof T ? T[K] extends object ? K : never : never;

type PartialAll<T> = {
  [K in PropsThatAreObjects<T, keyof T>]?: PartialAll<T[K]> &
  [K in keyof T except the ones in PropsThatAreObjects<T, keyof T>]?: T<K> 
};

我写这个有问题

[K in keyof T except the ones in PropsThatAreObjects<T, keyof T>]?: T<K> 

非常感谢 :)

标签: typescriptramda.js

解决方案


在我看来,PartialAll(或PartialRecursive)可以简化为:

type PartialAll<T> = T extends object ? { [K in keyof T]?: PartialAll<T[K]> } : T;

推荐阅读