MST

星途 面试题库

面试题:TypeScript 泛型默认类型与类型约束及逆变协变的综合考量

考虑一个场景,有一个 `FunctionWrapper` 类,它接受两个泛型类型 `A` 和 `B`,用于包装一个函数 `fn`,`fn` 的参数类型是 `A`,返回值类型是 `B`。要求为 `A` 设置默认类型 `string`,为 `B` 设置默认类型 `number`。同时,当 `A` 为 `string` 类型时,`B` 只能是 `number` 或 `string`;当 `A` 为 `number` 类型时,`B` 只能是 `boolean`。并且在 `FunctionWrapper` 类中实现一个 `execute` 方法来执行包装的函数。请完整实现这个 `FunctionWrapper` 类,并说明这里涉及到的类型约束以及逆变协变的体现。
28.3万 热度难度
前端开发TypeScript

知识考点

AI 面试

面试题答案

一键面试
class FunctionWrapper<A = string, B = number> {
    private fn: (arg: A) => B;
    constructor(fn: (arg: A) => B) {
        this.fn = fn;
    }
    execute(arg: A): B {
        return this.fn(arg);
    }
}

// 类型约束说明:
// 1. 为 A 设置默认类型 string,为 B 设置默认类型 number。
// 2. 当 A 为 string 类型时,B 只能是 number 或 string。
// 3. 当 A 为 number 类型时,B 只能是 boolean。

// 逆变协变体现:
// 在函数类型 (arg: A) => B 中,参数位置 A 体现逆变(因为函数参数类型允许更宽泛类型传入),返回值位置 B 体现协变(因为函数返回值类型必须与声明一致或更具体)。