MST

星途 面试题库

面试题:TypeScript 函数参数类型的联合与交叉应用

编写一个 TypeScript 函数,它接受一个参数,这个参数的类型是字符串或者数字的联合类型。如果传入的是字符串,返回字符串的长度;如果传入的是数字,返回数字的平方。并且使用交叉类型定义一个新类型,该类型结合了字符串和数字类型的部分属性,在函数内部尝试使用这个交叉类型进行一些逻辑操作(例如,假设交叉类型既有 length 属性又有 toFixed 方法,对传入值进行相应处理),请详细说明联合类型和交叉类型在函数参数类型检查中的作用及注意点。
26.0万 热度难度
前端开发TypeScript

知识考点

AI 面试

面试题答案

一键面试
// 定义交叉类型
type StringNumberCross = {
    length?: number;
    toFixed?: (digits: number) => string;
};

function processValue(value: string | number): number | string {
    if (typeof value ==='string') {
        const crossValue: StringNumberCross = value as any;
        return crossValue.length || value.length;
    } else {
        const crossValue: StringNumberCross = value as any;
        return crossValue.toFixed? crossValue.toFixed(2) : (value * value).toString();
    }
}

联合类型和交叉类型在函数参数类型检查中的作用及注意点:

  • 联合类型作用:在函数参数中使用联合类型(如 string | number),可以使函数接受多种类型的参数,增强函数的通用性。它允许在函数内部通过类型检查(如 typeof)来对不同类型的值进行不同的处理逻辑。
  • 联合类型注意点:在函数内部处理联合类型参数时,需要进行类型保护(如 typeof value ==='string'),以确保在使用特定类型的属性或方法时不会出现类型错误。同时,不能直接对联合类型使用仅属于其中某一种类型的属性或方法,必须先进行类型判断。
  • 交叉类型作用:交叉类型(如 StringNumberCross)用于将多个类型的属性合并到一个类型中。在函数内部,通过将值断言为交叉类型,可以使用假设合并后的属性和方法,在一定程度上模拟对多种类型通用的操作逻辑。
  • 交叉类型注意点:由于交叉类型是将属性合并,可能会出现属性名冲突或属性类型不兼容的问题。并且使用交叉类型时,需要通过类型断言(as any)来绕过类型检查,这可能会带来潜在的运行时错误,所以要谨慎使用。