MST

星途 面试题库

面试题:TypeScript默认与可选参数在接口和类型别名中的兼容性问题

假设有一个接口`MyInterface`,定义如下: ```typescript interface MyInterface { myFunction(a: number, b?: string, c: boolean = true): void; } ``` 现在有一个类`MyClass`实现了该接口: ```typescript class MyClass implements MyInterface { myFunction(a: number, b: string, c: boolean): void { // 函数体省略 } } ``` 这样的实现是否正确?如果不正确,为什么?应该如何修改?请详细说明在这种场景下默认参数与可选参数的兼容性规则及应用。
28.0万 热度难度
前端开发TypeScript

知识考点

AI 面试

面试题答案

一键面试
  1. 实现不正确
    • 原因:在MyInterface接口中,b参数是可选参数(b?: string),而在MyClass类的实现中,b参数变成了必选参数。并且MyInterfacec参数有默认值(c: boolean = true),而MyClass类实现时没有使用默认值。
  2. 修改方法
    • 方法一:使MyClass类的实现参数与接口完全一致,即给b参数加上可选标识?,并给c参数加上默认值true
class MyClass implements MyInterface {
    myFunction(a: number, b?: string, c: boolean = true): void {
        // 函数体省略
    }
}
  • 方法二:如果在MyClass类的逻辑中,b确实是必选参数,那么需要修改接口MyInterface,将b的可选标识?去掉,同时去掉c的默认值,使其与MyClass类的实现匹配。
interface MyInterface {
    myFunction(a: number, b: string, c: boolean): void;
}
class MyClass implements MyInterface {
    myFunction(a: number, b: string, c: boolean): void {
        // 函数体省略
    }
}
  1. 默认参数与可选参数的兼容性规则及应用
    • 兼容性规则
      • 可选参数(参数名?: 类型)在实现时可以是必选参数,但必选参数不能在实现时变成可选参数。
      • 有默认值的参数(参数名: 类型 = 默认值)在实现时可以省略默认值,但实现时不能改变参数的类型和位置。
    • 应用
      • 接口定义时使用可选参数和默认参数可以提供更灵活的调用方式,实现类可以根据具体需求决定是否遵循接口的可选或默认参数设置。如果实现类有特殊逻辑,需要必选某个接口中定义为可选的参数,那么可能需要调整接口定义,反之亦然。这样可以保证接口的调用者在调用接口方法时,能根据接口定义的参数灵活性进行调用,同时实现类也能根据自身业务逻辑合理实现接口方法。