如何在模块本身内部为模块定义类型?

时间:2018-12-29 14:38:52

标签: typescript types module

说我有一个名为hello-service.ts的打字稿文件:

export function hello1() { ... }
export function hello2() { ... }
export function hello3() { ... }

在某些情况下,我们需要此模块的类型。我们可以像这样在另一个ts文件中引用它:

import * as helloService from './hello-service.ts';

function getHelloModule(): typeof helloService {
  return hello;
}

但是我想知道,是否有可能在hello-service.ts文件本身的内部 定义这种类型?

目前,我只能通过指定每个函数来实现这一点,这很无聊:

export type HelloServiceType = {
   hello1: typeof hello1,
   hello2: typeof hello2,
   hello3: typeof hello3
}

有没有更简单的解决方案?

2 个答案:

答案 0 :(得分:1)

您可以将导入类型称为typeof import('./hello-service.ts')。这肯定可以从模块外部进行工作。我从未在模块中使用过它,但是从我尝试过的结果来看,即使它有点递归,它也能按预期工作:

// ./hello-service.ts
export function hello1() {  }
export function hello2() {  }
export function hello3() {  }


declare var exports: Self;
type Self = typeof import('./hello-service') 
export let self: Self = exports;

// usage.ts

import * as hello from './hello-service'
hello.self.hello1()

答案 1 :(得分:1)

提香的答案可以进一步简化:

hello.ts

export function hello1() { return 1 }
export function hello2() { return 1 }
export function hello3() { return 1 }

export type TypeOfThisModule = typeof import ('./hello');