面试题答案
一键面试interface User {
name: string;
age: number;
email: string;
}
// 将User接口中所有属性变为可选
type OptionalUser = {
[K in keyof User]?: User[K];
};
// 将User接口中所有属性变为只读
type ReadOnlyUser = {
readonly [K in keyof User]: User[K];
};
// 定义函数transformUser
function transformUser(user: User): OptionalUser & ReadOnlyUser {
return {
...user
} as OptionalUser & ReadOnlyUser;
}
// 解释:
// 1. `OptionalUser` 使用了映射类型。`[K in keyof User]` 遍历 `User` 接口的所有属性名,`?` 符号将每个属性变为可选。
// 2. `ReadOnlyUser` 同样使用映射类型。`readonly [K in keyof User]` 将每个属性变为只读。
// 3. `transformUser` 函数接收 `User` 类型参数,返回的对象结构与 `User` 相同,但符合 `OptionalUser & ReadOnlyUser` 类型,这里通过对象展开和类型断言来实现。