TypeScript:函数签名的别名不像直接注释那样严格

时间:2018-02-21 12:37:39

标签: 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"
});

错误消息:Object literal may only specify known properties, and 'unknownProperty' does not exist in type 'State',这就是我想要的。

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

1 个答案:

答案 0 :(得分:1)

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

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

x = y; // OK

但是在第二种情况下,返回类型是明确指定的(state: State): State,这里是"对象文字只能指定已知属性" 发挥作用