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

3

我正在尝试使用类型别名简化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”中,这正是我想要的。

两者有什么区别?为什么一个可以编译,但另一个不行?如何像第一个例子中使用单独定义那样强制执行类型安全性?

1个回答

2

这两种情况的区别在于第一种情况下,产生的函数类型(隐式解析)与类型 Reducer兼容的。请看以下示例:

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

x = y; // OK

然而,在第二种情况中,返回类型被明确指定为 (state: State): State,这里就会出现"对象文字只能指定已知属性"的情况。


谢谢回答。这是否意味着没有任何方法可以像我的第一个示例那样严格执行函数签名?这似乎并不是什么大问题,但由于我已经将先前的状态扩展到结果中,所以我无法防止拼写错误。 - severin
嗯,据我所知没有。如果有的话,我也想知道 :) - Aleksey L.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接