MST

星途 面试题库

面试题:TypeScript类型断言与类型转换在复杂类型场景下的运用

假设你有一个函数`processData`,它接收一个`any`类型的参数。这个参数在运行时可能是一个包含`id`(数字类型)和`name`(字符串类型)属性的对象,也可能是一个数字数组。请使用类型断言和类型转换两种方式,使函数能够安全地处理这两种可能的数据结构,并返回有意义的结果,同时说明在这个场景下选择类型断言或类型转换的原因。
16.6万 热度难度
前端开发TypeScript

知识考点

AI 面试

面试题答案

一键面试

类型断言方式

function processData(data: any): string | number[] {
    if (Array.isArray(data)) {
        return data;
    } else if (typeof data === 'object' && 'id' in data && 'name' in data) {
        const obj = data as { id: number; name: string };
        return `ID: ${obj.id}, Name: ${obj.name}`;
    }
    throw new Error('Unsupported data type');
}

类型转换方式

function processData(data: any): string | number[] {
    if (Array.isArray(data)) {
        return data;
    } else if (typeof data === 'object') {
        try {
            const obj = JSON.parse(JSON.stringify(data)) as { id: number; name: string };
            return `ID: ${obj.id}, Name: ${obj.name}`;
        } catch (e) {
            throw new Error('Unsupported data type');
        }
    }
    throw new Error('Unsupported data type');
}

选择原因

  • 类型断言:简单直接,运行时开销小。适用于对数据结构有较明确的判断逻辑,并且在运行时确定数据类型符合预期的场景。在这个例子中,通过typeofin操作符确认对象结构后使用类型断言,简洁高效。
  • 类型转换:相对复杂,运行时有额外的序列化和反序列化开销。适用于对数据来源不太信任,需要通过转换来确保数据结构符合预期的场景。例如从外部API获取的数据,通过JSON转换可以过滤掉一些非法属性,保证对象结构的一致性。