TypeScript:函数签名的类型别名不如直接注释严格

标签 typescript

我正在尝试使用类型别名在 TypeScript 中简化签名:

interface State {
  value: string;
  error: string;
}

type Reducer = (value: string) => (state: State) => State;

const setValue: Reducer = value => state => ({
  ...state,
  value,
  unknownProperty: "Hello"
});

我希望这会失败,因为我正在尝试设置一个不存在的属性。

当我这样做时,它确实失败了:

const setValue2 = (value: string) => (state: State): State => ({
  ...state,
  value,
  unknownProperty: "Hello"
});

带有错误消息:对象文字可能只指定已知属性,并且“unknownProperty”在类型“State”中不存在,这正是我想要的。

有什么区别?为什么一个编译,而另一个不编译?我如何像第一个示例一样使用单独的定义来像第二个示例一样强制执行类型安全?

最佳答案

不同之处在于,在第一种情况下,生成的函数类型(隐式解析)是 compatible类型为 Reducer。看看这个例子:

let x = () => ({name: "Alice"});
let y = () => ({name: "Alice", location: "Seattle"});

x = y; // OK

但是在第二种情况下,返回类型被显式指定 (state: State): State,这里 “Object literal may only specify known properties” 发挥作用

关于TypeScript:函数签名的类型别名不如直接注释严格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48906139/

相关文章:

javascript - React - Typescript 接口(interface) - 从联合类型获取 Prop 时出错

typescript - 如何将带有另一个字符串枚举键的枚举传递给接受字符串的函数?

typescript - @types - 对象键的值数组

typescript - 当私有(private)子网已经存在时,使用 CDK( typescript )向路由表添加条目

angular - ngIf 仅在 ngFor 的一个部分中列出

typescript - 如何让热模块重新加载以在 typescript monorepo 中工作

typescript - 可与 "+"运算符一起使用的通用类型

angular - 从 Angular 9.17 升级到 9.19 后无法构建

typescript - angular2 类型 'Subject<{}>' 不可分配给类型 '() => Subject<number>'

javascript - 从 ionic 3 中的父对象数组中检索对象数组