ts 有办法隐式修改 class constructor 的类型吗?

2023-02-23 13:11:39 +08:00
 a132811

我想给 callable object 加上 function 类型提示

// refer to: https://medium.com/@adrien.za/creating-callable-objects-in-javascript-fbf88db9904
class Callable extends Function {
  constructor() {
    super('return arguments.callee._call(...arguments)')
  }
}
class AjaxFactory extends Callable{
  constructor(){
    super()
  }
  _call(url:string, init?:RequestInit) {
    //middleware(init)
    return fetch(url, init)
  }
  //use(middleware){...}
}

每次创建新对象时,调用方总是要类型转换一下,才能获得类型提示

type AjaxFactoryF = AjaxFactory & AjaxFactory['_call']

const request=<AjaxFactoryF>(new AjaxFactory()) //使用方要进行一下类型转换

//request.use(middleware)
request('http://x.com').then(resp=>console.log(resp))

有办法简化吗?隐式修改 class constructor 的类型?

1043 次点击
所在节点    TypeScript
2 条回复
a132811
2023-03-08 20:08:04 +08:00
可加一个 alias 中间变量:AjaxFactoryAlias ,给中间变量带上扩展的类型 AjaxFactoryF


type AjaxFactoryF = AjaxFactory & AjaxFactory['_call']
const AjaxFactoryAlias = AjaxFactory as new ()=>AjaxFactoryF
export {AjaxFactoryAlias as AjaxFactory}
chnwillliu
320 天前
可以用同名 interface 来声明实例类型。

```typescript
abstract class Callable<T extends (...args:any[]) => any> extends Function {
constructor() {
super('return arguments.callee._call(...arguments)');
}
protected abstract _call(...args: Parameters<T>): ReturnType<T>;
}

interface Callable<T extends (...args:any[]) => any> extends Function {
(...args: Parameters<T>): ReturnType<T>
}

class AjaxFactory extends Callable<(url: string, init?:RequestInit) => Promise<any>> {
protected override _call(url: string, init?:RequestInit): Promise<any> {
return fetch(url, init)
}
}

const request = new AjaxFactory();

request('/test', {method:'GET'})
```

https://www.typescriptlang.org/play?ssl=20&ssc=33&pln=1&pc=1#code/IYIwzgLgTsDGEAJYBthjAgwsZqTIFMAeAFQQIA8ICA7AEwwAoA6V4KAczAC5gaBPANoBdAJQIAvAD4EffjMrV6GAGIBXGvACWAexoIA3gFgAUAnNI9kKGvg6ojccbMXXYNQAcCDgORQCEGpQ+uwcagC2tBBgzLA4hATMAPpxuCxsnBFRYKI+ogDcpq4AvkUWHlA61PAEdLLg0HCIKfHpzKE8CAAK7MCR1FBgpFKi3AgASgFBNCT8XsOFJqUmplo0AwBmcARY8aCEpORUtAwIbR28AiLi0rICCsfKCOqaELr6zq7nnJ09MP3eIYkEZjSaBYKzebA0zLUwoNAYACCACtgBQVE17PwjkpTthcPtiIwgsgxtY1hwADQINZaCAAfm4kwAjmoCJAAJI0Ok3GRdSrhLRgYhyKQyT7lSrVah1HQAN28UC0dB2LTSJLJ0Ap1NpDKZBFZ7IgXJ5Y35OkFwqIosMZVc5n84P0GwCsAAFsSoMgddyIKI7QhlrCTLArIh-IbIJIEDQCAB3BAotEYuxQfiORamCNsyCMHwAemokB81IM-TdOjo3B8AHEAKIkHzFURAA

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/918516

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX