为什么Class B可以通过Typescript编译(类型监测), Class C却不能通过, 期望Class B也不能通过编译

我希望Class B像Class C一样不能通过编译,
Class C 编译会报错如下:

Type '{ name: string; some: string; }' is not assignable to type 'Info'.
Object literal may only specify known properties, and 'some' does not exist in type 'Info'.


    interface Info {
      name: string;
    }
    
    interface Person {
      info(): Info;
    }
    
    class B implements Person {
        info() {
            return {
                name: "li",
                some: "1",
            };
        }
    }
    
    class C {
        info():Info {
            return {
                name: "li",
                some: "1",
            };
        }
    }
阅读 2.4k
3 个回答
class B implements Person {
    info():Info {
        return {
            name: "li",
            some: "1",
        };
    }
}

翻译成人话,class B

  • class B implements Person
  • B实现了Person接口
  • B.info的返回值满足Info的定义
  • { name: "li", some: "1" }满足了{ name: string }的定义
  • 通过

class C

  • info(): Info
  • info的返回值就是Info
  • { name: "li", some: "1" }{ name: string }不完全一致
  • 不通过

不太明白为什么希望BC一样不能通过编译……

TypeScript的核心原则之一是对值所具有的结构进行类型检查。 它有时被称做“鸭式辨型法”或“结构性子类型化”。

对于期待Info类型的变量来说,传递进来的对象多一两个属性也是毫无影响的。所以B能通过正是TypeScript的设计目标之一。

如果因为一些奇怪?的原因,一定要让B挂掉的话,可以用楼上的方法。

class C能通过编译?

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题