簡體   English   中英

為什么 Typescript 允許不正確的普通 object 返回接口定義

[英]Why does Typescript allowed incorrect plain object return for Interface definition

更新:

另一個問題回答了“為什么”。

“如何解決”現在是這個新問題:

如何讓 Typescript 檢查返回類型是否與結構完全匹配?


原來的:

我缺少錯誤聲明,因為 Typescript 沒有告訴我我添加了不正確的數據。

為什么 Typescript 允許這樣做?

這是一個錯誤還是這是什么原因?

在此處查看代碼框: https://codesandbox.io/s/k3ud7

interface ITester {
  string1: string;
}

type TestType<S = any> = (item: S) => S | undefined;

const Foo: TestType<ITester> = input => {
  return {
    ...input,
    foo: 42 // <-- This should not be allowed !
  };
};

Typescript 確實確保不添加額外屬性的更多示例:

const t1: ITester = {
  string1: "Hi",
  foo: 42 // <-- Typescript dont allow this
};
const Foo3: TestType<ITester> = input => {
  const returnVal: ITester = {
    ...input,
    foo: 42 // <-- Typescript dont allow this!
  };
  return returnVal;
};

正如TypeScript 文檔所說:

TypeScript 的核心原則之一是類型檢查側重於值的形狀。 這有時被稱為“鴨子類型”或“結構子類型”。 在 TypeScript 中,接口充當命名這些類型的角色,並且是在代碼內定義合同以及與項目外部代碼定義合同的強大方式。

在大多數支持該概念的語言中,接口是一組屬性。 任何實現該接口的 object 都必須提供它們,但不會強制將其屬性限制為由該接口定義的屬性。 事實上,一個 object 可以實現任意數量的接口。
更重要的是,當 class 實現接口時,無需聲明。 一個可以,但他們不需要。 TypeScript 不在乎。 如果 object 提供接口所需的所有屬性,則 object 與接口兼容。

或者,使用文檔的話

值得指出的是,類型檢查器不要求這些屬性以任何順序出現,只要求接口所需的屬性存在並且具有所需的類型。

您的 function 的聲明說它返回一個實現接口S的 object 。
任何包含名為string1的字符串屬性的 object 都與接口S兼容,並且可以通過 function 成功返回。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM