TypeScript: Kısmen "Partial" tipi


Çevre

TypeScript sürümü 3.2.1'dir ve "tsconfig.json" aşağıdaki gibidir.

{
  "compilerOptions": {
    "target": "es5",
    "module": "commonjs",
    "strict": true,
    "noUnusedLocals": true,
    "noUnusedParameters": true,
    "noImplicitReturns": true,
    "noFallthroughCasesInSwitch": true,
    "esModuleInterop": true
  }
}

Soru

TypeScript'te Kısmi "Partial" türünü arıyorum.

type Entity = {
  a: string,
  b: string,
  c?: string,
};

type Ham = MyType<Entity, 'b'>;
/**
 * expected to equal
 * {
 *   a: string,
 *   b?: string, // changed to be optional
 *   c?: string,
 * };
 */

Not: Titian ve t7yang

Cevaplarınız için teşekkür ederim. Türlerinizi kontrol ettim, ardından her iki tür de derleyicinin kontrolünden geçti!

const abc = { a: 'a', b: 'b', c: 'c' };
const ab = { a: 'a', b: 'b' };
const ac = { a: 'a', c: 'c' };
const a = { a: 'a' };

// by t7yang
let test1Abc: OptionalKey<Entity, 'b'> = abc;
let test1Ab: OptionalKey<Entity, 'b'> = ab;
let test1Ac: OptionalKey<Entity, 'b'> = ac;
let test1A: OptionalKey<Entity, 'b'> = a;

// by Titian Cernicova-Dragomir    
let test2Abc: PickPartial<Entity, 'b'> = abc;
let test2Ab: PickPartial<Entity, 'b'> = ab;
let test2Ac: PickPartial<Entity, 'b'> = ac;
let test2A: PickPartial<Entity, 'b'> = a;

Cevap #1

Pick öğesini Partial ile birlikte kullanarak, sadece isteğe bağlı yapmak istediğiniz özellikleri seçebilir ve kalanları korumak için, isteğe bağlı yapmak için geçenleri hariç tutarak anahtarları almak için Exclude'ü kullanabilirsiniz:

type Entity = {
   a: string,
   b: string,
   c?: string,
};

type PickPartial<T, K extends keyof T> = Pick<T, Exclude<keyof T, K>> & Partial<Pick<T, K>> 
type Ham = PickPartial<Entity, 'b'>; // a, b? , c?

Cevap #2

Gerçek basit çözüm:

type PickPartial<T, K extends keyof T> = Omit<T, K> & Partial<Pick<T, K>>;
type PartialExcept<T, K extends keyof T> = Pick<T, K> & Partial<Omit<T, K>>;

Titian'ın çözümü, Omit yardımcısını ekleyen Typescript 3.5'ten önce yazılmıştı.

Ayrıca, isteğe bağlı yapılacak birden fazla niteliği seçmek için string birliklerini kullanabileceğinizi unutmayın:

type Full = {
  a: string;
  b: string;
  c: string;
}

// These are equivalent
type ARequired = PickPartial<Full, 'b' | 'c'>;
type ARequired = PartialExcept<Full, 'a'>;

İlgili makaleler