Mapped Types: MyPick, MyReadonly, MyOmit
Schreib eigene Versionen der Utility Types ohne die eingebauten Pick, Readonly, Omit und Exclude.
MyPick<T, K> behält nur die Schlüssel K von T (und lehnt einen Schlüssel ab, den T nicht hat), MyReadonly<T> macht jedes Feld auf der ersten Ebene readonly, und MyOmit<T, K> entfernt die Schlüssel K und lässt die übrigen Felder optional, wo sie es waren.
Strg+Enter führt die Tests aus. Tab rückt ein; um den Editor per Tastatur zu verlassen, drücke Esc und dann Tab. Der Code wird in diesem Browser gespeichert.
Tests (5)
Typtests prüft der TypeScript-Compiler im strict-Modus. Expect<Equal<A, B>> besteht, wenn die Typen exakt gleich sind, und // @ts-expect-error, wenn die nächste Zeile nicht kompiliert. Der erste Start lädt den Compiler und dauert daher ein paar Sekunden.
- Typen
interface Todo { title: string; done: boolean; tags: string[] } type _ = Expect<Equal<MyPick<Todo, 'title' | 'done'>, { title: string; done: boolean }>>;
- Typen
interface Todo { title: string; done: boolean } // @ts-expect-error - 'nope' is not a key of Todo type _ = MyPick<Todo, 'nope'>;
- Typen
interface Todo { title: string; meta: { done: boolean } } type _ = Expect<Equal<MyReadonly<Todo>, { readonly title: string; readonly meta: { done: boolean } }>>;
- Typen
interface Todo { title: string; done: boolean; tags: string[] } type _ = Expect<Equal<MyOmit<Todo, 'tags'>, { title: string; done: boolean }>>;
- Typen
interface Todo { title: string; done?: boolean } type _ = Expect<Equal<MyOmit<Todo, 'title'>, { done?: boolean }>>;