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

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

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

阅读 412
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
子站问答
访问
宣传栏