Typescript指定返回或函数类型不相同

时间:2019-12-19 11:21:52

标签: typescript

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
}

游乐场:https://www.typescriptlang.org/play/?ssl=15&ssc=2&pln=11&pc=2#code/MYewdgzgLgBAhgRgFwwBQEoYF4B8MDe8K0ATgJZgDmMAvtmprgQFAwwkCmUAriWAXBQByIQBoYAI2FC6AelkwwIWBxIkQ5KgEIA-MxrNmoSLDgAmehiSFBMUhWp0m+Vuy69++WyPFSYIuQUyCBhVdU1qOBCOAA8ABw5gKA4AE31DY2h4AGYUDGw8G2IoCNpLRkLXTh4+Aj8AmHkYYNC1DQd4aPjE5LSaIA

这2应该是同一件事,但是a2会有打字错误。

我的代码以a1格式(已定义函数)完成,并且没有出错。如果不正确,我想知道该怎么办。

正如您在a3中看到的那样,这是错误的。因此,它仍在检查类型,但不如a2中的准确。太奇怪了。

“打字稿”:“ ^ 3.7.2”

Error in ide

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.
}

2 个答案:

答案 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: '',
      }
    };

在这种情况下,不需要的任何其他字段都会产生编译器错误,同样会省略必填字段。

希望这会有所帮助。