为什么Typescript允许接口定义返回不正确的普通对象

为什么Typescript允许接口定义返回不正确的普通对象,typescript,Typescript,更新: “为什么”用另一个问题来回答 “如何修复”现在是一个新问题: 原件: 我缺少错误语句,因为Typescript没有告诉我添加了不正确的数据 为什么Typescript允许这样做 这是一个bug还是原因是什么 请参见此处的codesandbox: interface ITester{ string1:string; } 类型TestType=(项:S)=>S |未定义; 常量Foo:TestType=input=>{ 返回{ 输入 foo:42/正如上面所说: TypeScript的核

更新:

“为什么”用另一个问题来回答

“如何修复”现在是一个新问题:


原件:

我缺少错误语句,因为Typescript没有告诉我添加了不正确的数据

为什么Typescript允许这样做

这是一个bug还是原因是什么

请参见此处的codesandbox:

interface ITester{
string1:string;
}
类型TestType=(项:S)=>S |未定义;
常量Foo:TestType=input=>{
返回{
输入
foo:42/正如上面所说:

TypeScript的核心原则之一是类型检查关注值的形状。这有时被称为“duck类型”或“structural subtyping”.在TypeScript中,接口扮演命名这些类型的角色,是在代码内定义契约以及在项目外定义代码契约的强大方式

在大多数支持该概念的语言中,接口是一组属性。实现接口的任何对象都必须提供这些属性,但不强制将其属性限制为该接口定义的属性。事实上,一个对象可以实现任意数量的接口。
更重要的是,当类实现接口时,不需要声明。可以声明,但不需要声明。TypeScript不关心它。如果对象提供接口所需的所有属性,则该对象与接口兼容

或者,使用:

值得指出的是,类型检查器并不要求这些属性按任何顺序出现,只要求接口所需的属性存在并且具有所需的类型

函数的声明表示它返回一个实现接口
S


任何包含名为
string1
的字符串属性的对象都与接口
S
兼容,并且可以由函数成功返回。

我可以看出,我应该从沙盒测试中添加更多的示例。我现在更新了问题。当我声明接口的新常量时,检查已经完成,但它仍然存在不是函数的返回类型。我还更新了实际的问题,因为我真的需要能够让Typescript测试我的返回类型。很抱歉,不准确。
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 !
  };
};
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;
};