Mutable Keys
Challenge
Implement the advanced util type MutableKeys
For example:
type Keys = MutableKeys<{ readonly foo: string; bar: number }>;
// expected to be “bar”
Solution
Zur Lösung dieses Problems definieren wir einen Hilfstyp IsReadOnly, der ein Objekttyp sowie einen Schlüssel des Objekttyps entgegennimmt und angibt, ob der Schlüssel readonly ist. Hierfür wird der Wert mittels Pick aus dem Objekttyp extrahiert und mit einem mapped type verglichen, welcher das gleiche Schlüssel / Wert Paar aufweist. Ist der Schlüssel also im originalen Objekttyp nicht readonly, so ist das Ergebnis nicht gleich, und damit der Schlüssel nicht readonly.
// Equal<{foo: bar}, {readonly foo: bar}> => false
// Equal<{readonly foo: bar}, {readonly foo: bar}> => true
type IsReadOnly<T, P extends keyof T> = Equal<
Pick<T, P>,
{ readonly [K in P]: T[P] }
>;
Der finale Typ stellt einen mapped type dar, bei dem wir bereits in der Iteration über die Schlüssel prüfen, ob der Schlüssel readonly ist:
type MutableKeys<T> = keyof {
[P in keyof T as IsReadOnly<T, P> extends true ? never : P]: T[P];
};