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'>;
