const a1: () => { a: string } = () => {
return {a: '', b: ''} // not erroring!?
}
const a2 = ():{ a: string } => {
return {a: '', b: ''} // is erroring as expected
}
const a3: () => { a: string } = () => {
return {b: ''} // is erroring as expected
}
这2应该是同一件事,但是a2
会有打字错误。
我的代码以a1格式(已定义函数)完成,并且没有出错。如果不正确,我想知道该怎么办。
正如您在a3中看到的那样,这是错误的。因此,它仍在检查类型,但不如a2中的准确。太奇怪了。
“打字稿”:“ ^ 3.7.2”
interface State {a:string}
const similarToRealWorldIssue: (state:State ) => State = (state) => {
return {...state, b: 'ssda'} // here I meant to put `a`, but I put `b` by mistake and nobody complained.
}
答案 0 :(得分:0)
本质上,第一种情况是这样的:
const a1_anon = () => {
return {a: '', b: ''} // not erroring!?
}
// inferred type of a1_anon is () => {a: string, b: string}
const a1: () => { a: string } = a1_anon
如果您不希望发生这种情况,则需要指定类型,这样就不会像这样推断:
const a1: () => { a: string } = (): {a: string} => {
return {a: '', b: ''} // not erroring!?
}
我知道它被指定了两次,但是由于您坚持要定义一个匿名函数,然后将其分配给该变量,因此没有其他方法。
当然,您可以按照定义a2
的方式进行操作,因为它不会两次指定类型,而是执行您需要的操作,但是您已经知道了。
对于您的特定问题,您可以只使用a2
来定义事物。如果State
接口不是太大,那么您始终可以将所有值分配给返回的State
对象,这样,如果您输错了某些内容,它将是缺少的属性,而不是其他属性({{ 1}}的用法无论如何在我看来还是有问题的。还有一种方法是定义一个函数,并在返回...
对象时始终使用它。
State
使您可能想使用getter和setter方法定义const statify = (state: State): State => { return state }
const exampleUsage: (state: State) => State = (state) => {
return statify({...state, c: '' })
}
类失败,并使用该类代替任意对象。同样不确定是否要始终复制状态并更改其属性,但是如果这样做,则可以在该类中实现复制方法。
想到了另一个选择,这会将State
更改为{...state, <properties>}
stateAdd(state, {<properties>})
答案 1 :(得分:0)
您的similarToRealWorldIssue
函数可以分为两部分。
第一部分
const similarToRealWorldIssue: (state:State ) => State
声明并指定similarToRealWorldIssue
的返回类型为State
。
第二部分
= (state) => {
return {...state, b: 'ssda'}
}
是没有明确定义的返回类型的函数,因此返回any
。
打字稿编译器不会抱怨,因为类型any
也可能是State
。
您可以通过两种方式解决此问题。
解决方案1:将State
指定为箭头函数第二部分的返回类型。
const similarToRealWorldIssue: (state:State ) => State = (state): State => {
return {...state, b: 'ssda'}
}
解决方案2:首选解决方案,因为它可以简化您的功能并使其更易于阅读。
const similarToRealWorldIssue = (state: State): State => {
return{
a: '',
}
};
在这种情况下,不需要的任何其他字段都会产生编译器错误,同样会省略必填字段。
希望这会有所帮助。