TS 如何定义函数对象的属性?

请问如何定义下方代码中 abort 在 getData 的类型

function getData(): Promise<AxiosResponse> {
  // 函数内代码
  return Promise.resolve({})
}

// 再在函数自身上定义一个属性
function setAbort(callFunc: Function) {
  callFunc.abort = () => {}  // Property 'abort' does not exist on type 'Function'
}
setAbort(getData)

// 调用abort
getData.abort() // Property 'abort' does not exist on type '() => Promise<AxiosResponse>'.

我有一个想法,自定义一个继承自Function的接口,不知道是否可行,但是我目前还没有能力实现:(

interface MyFunction extends Function {
    abort?: () => void
}
阅读 5.1k
4 个回答

可以用interface 声明函数

// AxiosResponse 类型模拟
type AxiosResponse = {
  [key:string]:any
}

interface getData {
  () : Promise<AxiosResponse>
  abort: () => void;
}

function getData(): Promise<AxiosResponse> {
  // 函数内代码
  return Promise.resolve({})
}
// 再在函数自身上定义一个属性
getData.abort = () => {} 

// 调用abort
getData.abort()
新手上路,请多包涵

可以把函数改成class的形式,或者是把abort方法放在函数结果内

可以使用交叉类型,代码:

// AxiosResponse 类型模拟
type AxiosResponse = {
  [key:string]:any
}

type MyFunc = (() => Promise<AxiosResponse>) & { abort?: () => void };

const getData: MyFunc = function (): Promise<AxiosResponse> {
  // 函数内代码
  return Promise.resolve({})
}

// 再在函数自身上定义一个属性
function setAbort(callFunc: MyFunc) {
  callFunc.abort = () => {}  
}
setAbort(getData)

// 调用abort
getData.abort && getData.abort()

我不好奇这个ts声明怎么写,但是我很好奇你的代码怎么写。

如果abort方法不是通用的,那么你的setAbort基本没意义。如果abort是通用的,你直接调用就行了,还set一次干什么。

function abortReq(call: Function) {
  callFunc.abort = () => {};
  return callFunc.abort();
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进