[英]Why does defaultProps with interface not allowed ? mark in typescript
[英]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.