TypeScript中默认对象属性值的函数类型

时间:2019-11-22 07:44:32

标签: typescript default-value destructuring

  • TypeScript@3.7.2
  • WebStorm@2019.2

我的功能如下:

VkCmdDrawIndirect

在Typescript中,我希望将其键入,这是我可以这样做的唯一方法:

const fetchList = ({ current = 1, pageSize = 10 } = {}) => {/*...*/}
fetchList() // invoke

但是我想像这样单独制作函数类型声明,以便可以重用,然后函数声明会出错:

const fetchList=({current = 1, pageSize = 10}?: {current?: number; pageSize?: number} = {}) => {/*...*/}
fetchList() // invoke

TypeScript Error


如果我解决了这个问题,我应该像这样传递函数类型声明,使对象参数不是可选的

type FetchListType = ({ current, pageSize }?: { current?: number; pageSize?: number }) => void
const fetchList: FetchListType = ({ current = 1, pageSize = 10 } = {}) => {/*...*/}

这个结果我应该用空对象调用type FetchListType = ({ current, pageSize }: { current?: number; pageSize?: number }) => void

fetchList

问题是:如何声明可以使我不带参数调用函数的函数类型?

2 个答案:

答案 0 :(得分:1)

首先,原始实现未在TS 3.7.2中编译

const fetchList=({current = 1, pageSize = 10}?: {current?: number; pageSize?: number} = {}) => {/*...*/} 
// Error - Parameter cannot have question mark and initializer

让我们专注于您要解决的问题。我试图在元级别上解决您的问题,但是到了我认为这是一个不同级别的问题。好像可以不带参数地调用函数一样,在此级别进行分解是错误的,这是典型的代码错误。我们不能破坏无法通过的东西。因此,TS在这里做得很好。

FetchListType函数类型允许不带参数调用函数,这也是您想要的。所以您的第一种类型是正确的:

type FetchListType = ({ current, pageSize }?: { current?: number; pageSize?: number }) => void

它定义了或者没有参数或者将具有给定结构的参数。大!现在解决问题:

const fetchList: FetchListType = ({ current = 1, pageSize = 10 } = {}) => {/*...*/}

以上是函数对FetchListType的实现有误,该实现假定参数存在,但类型不能保证。类型是正确的,它满足具有带可选参数的函数的需要。现在我们只需要添加正确的实现,这样就可以处理参数的可选性质:

type FetchListType = ({ current, pageSize }?: { current?: number; pageSize?: number }) => void
const fetchList: FetchListType = (arg) => {
  if (arg) {
    arg // here arg is { current?: number; pageSize?: number }
  } else {
    // here arg is undefined
  }
}

// also correct implementation which has default value of the argument:
const fetchList: FetchListType = (arg = { current: 1, pageSize: 10 }) => {
  console.log(arg); // if arg will not be passed it will be { current: 1, pageSize: 10 }
}


总结。我们不能编写实现比类型强的假设的实现。类型不允许任何参数,实现需要处理。

答案 1 :(得分:0)

我解决问题的方法是这样的:

type FetchListType = (search?: { current?: number; pageSize?: number }) => void
const fetchList: FetchListType = (search = {}) => {
  const {current, pageSize} = {current: 1, pageSize: 10, ...search}
  /*...*/
}
fetchList()