MST
星途 面试题库

面试题:TypeScript精确字符串类型在泛型与条件类型中的深度应用

创建一个泛型函数`processString`,该函数接收一个字符串类型的参数`str`和一个字符串类型字面量的联合类型`AllowedStrings`。当`str`属于`AllowedStrings`时,函数返回一个对象,对象中包含`str`和一个根据`str`值计算出的结果(例如,如果`str`是'add',结果为两个数相加;如果是'subtract',结果为两个数相减等);当`str`不属于`AllowedStrings`时,返回`null`。请使用TypeScript的条件类型和更精确字符串类型来实现该函数,并详细解释实现过程中的类型推导逻辑。
27.9万 热度难度
前端开发TypeScript

知识考点

AI 面试

面试题答案

一键面试
type AllowedStrings = 'add' |'subtract';

function processString<
  Str extends string,
  Allowed extends string
>(str: Str, AllowedStrings: Allowed): Str extends Allowed
  ? { value: Str; result: number }
   : null {
  if ((AllowedStrings as string[]).includes(str)) {
    let num1 = 5;
    let num2 = 3;
    if (str === 'add') {
      return { value: str, result: num1 + num2 } as { value: Str; result: number };
    } else if (str ==='subtract') {
      return { value: str, result: num1 - num2 } as { value: Str; result: number };
    }
  }
  return null;
}

类型推导逻辑解释

  1. 泛型定义
    • Str extends string:定义一个泛型Str,它是字符串类型的子类型,用于表示传入的字符串参数str的类型。
    • Allowed extends string:定义一个泛型Allowed,它是字符串类型的子类型,用于表示联合类型AllowedStrings的类型。
  2. 条件类型
    • Str extends Allowed? { value: Str; result: number } : null:这是一个条件类型。如果Str(即传入的str的类型)是Allowed(即AllowedStrings)的子类型,那么函数返回一个对象,该对象包含属性value(类型为Str,即传入的字符串本身)和result(类型为number,是根据str计算出的结果)。否则,返回null
  3. 运行时判断
    • (AllowedStrings as string[]).includes(str):在运行时,通过将联合类型AllowedStrings转换为字符串数组,并使用includes方法判断str是否属于AllowedStrings。如果属于,则根据str的值进行相应的计算并返回包含str和计算结果的对象;如果不属于,则返回null