Mutable
挑战
实现泛型 Mutable<T>
,使 T
中所有属性都是可变的。
比如:
interface Todo {
readonly title: string;
readonly description: string;
readonly completed: boolean;
}
// { title: string; description: string; completed: boolean; }
type MutableTodo = Mutable<T>;
解答
我认为这个挑战不应该属于中等类别。我毫无困难的解决了它。不管怎样,我们将解出所有 的挑战。
我们知道有一种类型在对象的属性上带有只读的修饰符。这个修饰符和我们之前 的Readonly challenge一样。然而,这次要求我们从类型中去掉该 修饰符。
让我们先从最简单的开始,使用映射类型原样复制这个类型:
type Mutable<T> = { [P in keyof T]: T[P] };
现在它是带有只读修饰符的 T
的副本。我们怎样去掉他们呢?好吧,记得在上一次的挑
战中为了加上它们,我们只是把关键字 readonly
加到映射类型上:
type Mutable<T> = { readonly [P in keyof T]: T[P] };
TypeScript 隐式地给 readonly
关键字加了一个 +
,意思是我们向属性添加修饰符。
但在我们这个例子中,我们需要丢弃它,于是我们用 -
代替:
type Mutable<T> = { -readonly [P in keyof T]: T[P] };
这样,我们实现了一种类型,可以从属性中丢弃只读修饰符。
评论