MST

星途 面试题库

面试题:TypeScript中type与interface在类型体操及复杂类型定义中的策略选择

在处理复杂类型和类型体操相关的场景中,例如条件类型、映射类型等,type和interface各有其优势和适用场景。请举例说明在一些复杂的类型定义需求下,如何精准选择type或interface,或者如何结合两者使用,以高效且优雅地解决类型相关问题,并阐述这样选择的理由。
37.5万 热度难度
前端开发TypeScript

知识考点

AI 面试

面试题答案

一键面试

1. 条件类型场景

  • type的优势:条件类型在type中定义更灵活。例如,定义一个根据类型判断返回不同类型的工具类型:
type IsString<T> = T extends string ? true : false;
type IfString<T, U, V> = T extends string ? U : V;

这里type可以轻松构建复杂的条件类型逻辑。理由是type更侧重于类型运算和构建新类型,对于这种依赖类型关系进行动态类型选择的场景,它的语法和能力更适配。

2. 映射类型场景

  • type的优势:在映射类型中,type同样表现出色。比如,将一个对象类型的所有属性变为只读:
type ReadonlyKeys<T> = {
    readonly [K in keyof T]: T[K];
};

type可以方便地基于现有类型映射出新类型,因为它专门用于类型构建,对于这种需要遍历和修改类型结构的操作,语法简洁且高效。

3. 合并类型定义

  • interface的优势interface用于声明合并非常方便。当你需要逐步扩展一个类型定义时,interface很实用。例如:
interface User {
    name: string;
}
interface User {
    age: number;
}
// User 类型现在既有 name 又有 age

这里通过多次声明同一个interface,实现类型的合并。理由是interface主要用于对象类型的声明,声明合并的特性让它在逐步构建对象类型时更直观,符合面向对象编程中对类型逐步细化的思维。

4. 结合使用

  • 结合方式及理由:在一些复杂场景下,可以结合使用。比如,先使用interface定义对象的基本结构,再用type基于这个interface进行复杂的类型变换。
interface User {
    name: string;
    age: number;
}
type ReadonlyUser = ReadonlyKeys<User>;

这样先用interface清晰地定义对象的属性结构,符合对象类型声明的习惯,再利用type强大的类型运算能力对interface定义的类型进行处理,充分发挥两者的优势,高效且优雅地解决复杂类型问题。