1. 如何在TypeScript中根据对象的结构动态决定属性的必填性?

type A = {
  b: {
    c?: string;
  };
  a: {
    c: string;
  };
};
interface AddDisplayItem<T extends keyof A> {
  data: A[T];
}

我希望data是否必传由A[T]是否有必传属性决定。如何做呢?

阅读 414
1 个回答
type A = {
  b: {
    c?: string;
  };
  a: {
    c: string;
  };
};

type AllOptional<T> = {
  [K in keyof T]-?: {} extends Pick<T, K> ? never : K
}[keyof T] extends never ? true : false;

type AddDisplayItem<T extends keyof A> = AllOptional<A[T]> extends true
  ? { data?: A[T] }
  : { data: A[T] };

const item1: AddDisplayItem<'a'> = { data: { c: 'Hello' } }; // 'data' is required
const item2: AddDisplayItem<'b'> = {}; // 'data' is optional
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
logo
Microsoft
子站问答
访问
宣传栏