挑战
实现一个为接口添加一个新字段的类型。该类型接收三个参数,返回带有新字段的接口类型。
例如:
type Test = { id: '1' };
type Result = AppendToObject<Test, 'value', 4>; // expected to be { id: '1', value: 4 }解答
这道题我首先想到了使用交叉类型。
type AppendToObject<T, U extends PropertyKey, V> = T & { [key in U]: V };但是不满足测试用例,测试用例希望我们返回普通类型而不是交叉类型。所以我们需要返回一个对象,里面包含所有属性和新加的属性。我们可以先从映射 T 的属性开始。
type AppendToObject<T, U extends PropertyKey, V> = {
[K in keyof T]: T[K];
};现在我们要把新字段加进去。我们知道 keyof T 是一个联合类型,可以直接加入新字段。
type AppendToObject<T, U extends PropertyKey, V> = {
[K in keyof T | U]: T[K];
};现在值的类型就不能一直是 T[K] 了,如果 K 来自于 keyof T 那么就是 T[K],否则返回 V。
所以最终实现为:
type AppendToObject<T, U extends PropertyKey, V> = {
[K in keyof T | U]: K extends keyof T ? T[K] : V;
};