我试图使用类型别名简单地在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'
,这就是我想要的。
有什么区别?为什么编译,但另一个不编译?如何使用第一个示例中的单独定义来强制类型安全,如第二个示例?
答案 0 :(得分:1)
不同之处在于,在第一种情况下,生成的函数类型(隐式解析)为compatible,类型为Reducer
。看看这个例子:
let x = () => ({name: "Alice"});
let y = () => ({name: "Alice", location: "Seattle"});
x = y; // OK
但是在第二种情况下,返回类型是明确指定的(state: State): State
,这里是"对象文字只能指定已知属性" 发挥作用