我正在尝试使用类型别名在 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/