2017-02-01 7 views
11

mam ten interfejs:Recursive Częściowa <T> w maszynopisie 2,1

export interface UserSettings 
{ 
    one: { 
     three: number; 
     four: number; 
    }; 
    two: { 
     five: number; 
     six: number; 
    }; 
} 

... i chcą przekształcić go w ten sposób:

export interface UserSettingsForUpdate 
{ 
    one?: { 
     three?: number; 
     four?: number; 
    }; 
    two?: { 
     five?: number; 
     six?: number; 
    }; 
} 

... ale Partial<UserSettings> produkuje to:

{ 
    one?: { 
     three: number; 
     four: number; 
    }; 
    two?: { 
     five: number; 
     six: number; 
    }; 
} 

Czy można używać typów odwzorowanych, aby wszystkie właściwości na wszystkich głębokościach były opcjonalne, czy też musisz ręcznie stworzyć interfejs?

Odpowiedz

11

można zrobić własny typ odwzorowania, tak:

type RecursivePartial<T> = { 
    [P in keyof T]?: RecursivePartial<T[P]>; 
}; 

enter image description here

Niestety, to nie działa w przypadku pól tablicy wpisany. Wydaje się, że nie ma jeszcze sposobu na wykonywanie mapowania warunkowego; tj. ograniczenie do prymitywów. Zobacz https://github.com/Microsoft/TypeScript/pull/12114#issuecomment-259776847

+0

Dobrze, dzięki! Jeśli jednak zmienię interfejs 'Bar' na' interface Bar {names: string []; } 'następnie VS Code mówi mi, że' names' ma typ 'RecursivePartial' zamiast' string [] '. jakieś pomysły? –

+0

Podejrzewam, że jest to bieżące ograniczenie: zobacz https://github.com/Microsoft/TypeScript/pull/12114#issuecomment-259776847, https://github.com/Microsoft/TypeScript/issues/12424 i https: // github.com/Microsoft/TypeScript/issues/13257 –

+0

Będę oglądać te problemy i aktualizować tę odpowiedź po ich rozwiązaniu. –