MST

星途 面试题库

面试题:TypeScript 中的映射类型与条件类型的深度应用

假设你有一个接口定义如下:interface User { name: string; age: number; email: string; }。现在需要基于这个接口,通过映射类型和条件类型创建两个新类型。第一个新类型 `OptionalUser`,将 `User` 接口中所有属性变为可选;第二个新类型 `ReadOnlyUser`,将 `User` 接口中所有属性变为只读。并且,再创建一个函数 `transformUser`,它接受一个 `User` 类型参数,返回一个 `OptionalUser & ReadOnlyUser` 类型的对象。请写出完整的 TypeScript 代码,并解释每一步中映射类型和条件类型的运用逻辑。
29.0万 热度难度
前端开发TypeScript

知识考点

AI 面试

面试题答案

一键面试
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` 类型,这里通过对象展开和类型断言来实现。