鍍金池/ 問答/網(wǎng)絡(luò)安全  HTML/ 為什么Class B可以通過Typescript編譯(類型監(jiān)測), Class

為什么Class B可以通過Typescript編譯(類型監(jiān)測), 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",
            };
        }
    }
回答
編輯回答
朕略傻

class C能通過編譯?

2018年9月11日 21:29
編輯回答
解夏

翻譯成人話,class B

  • class B implements Person
  • B實現(xiàn)了Person接口
  • B.info的返回值滿足Info的定義
  • { name: "li", some: "1" }滿足了{ name: string }的定義
  • 通過

class C

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

不太明白為什么希望BC一樣不能通過編譯……

TypeScript的核心原則之一是對值所具有的結(jié)構(gòu)進行類型檢查。 它有時被稱做“鴨式辨型法”或“結(jié)構(gòu)性子類型化”。

對于期待Info類型的變量來說,傳遞進來的對象多一兩個屬性也是毫無影響的。所以B能通過正是TypeScript的設(shè)計目標(biāo)之一。

如果因為一些奇怪?的原因,一定要讓B掛掉的話,可以用樓上的方法。

2017年8月7日 22:29
編輯回答
野橘
class B implements Person {
    info():Info {
        return {
            name: "li",
            some: "1",
        };
    }
}
2017年4月3日 22:51