Typescript函数声明与实现分开

时间:2019-08-06 19:53:26

标签: typescript

我想为一组Typescript函数编写一个规范,并在单独的文件中实现,然后让tsc检查实际实现是否符合规范。

类似这样的东西:

f-spec.ts:

export declare function foo(s: string, i: int): int;

,然后在另一个源文件中:

f.ts:

// import { foo } from './f-spec' <<< Doesn't work, gives error
export foo(s: string, i: int) { return i }

当我实际上尝试包括该导入时,出现错误“导入声明与本地定义冲突”。

我应该如何在一个文件中声明该函数并在另一个文件中实现它? (是的,我是一个C ++的老家伙,我知道这就像一个C ++头文件一样。但是在这种情况下,这就是我的需要。)

2 个答案:

答案 0 :(得分:1)

在打字稿中,定义和实现都在同一个命名空间中。

如果您想拥有一个类型以及实现该类型的实现,则它们必须具有不同的名称。

但是,当您导入类型时,可以给它一个别名,使您可以在2个不同的文件中使用相同的名称。

我会质疑为您编写的每个函数执行此操作的合理性。即使这是一种习惯,在引入自己的变体之前,尝试模仿新生态系统中的开发人员的工作也是一个好主意。在破坏规则之前先掌握它们。

答案 1 :(得分:1)

TypeScript不支持像这样的前向函数声明。将来会might support forward type/interface declarations,但我不知道这是否会对您的用例有所帮助(而且从TS3.5开始,它在TS中不可用)


解决方法:与其尝试declare函数,不如为其提供一种类型:

type FooFuncType = (s: string, i: number) => number; // int ain't a thing in JS/TS

然后在实现功能时

function foo(s: string, i: number) {
  return s.length + i;
}

您可以创建仅在foo符合FooFuncType的情况下才能干净编译的值或类型工件:

const fooIsRightType: FooFuncType = foo; // okay
// or
type FooIsRightType<T extends FooFuncType = typeof foo> = true; // okay

如果您执行不匹配的操作,例如

function foo(s: string, i: number) {
  return s + i;
}

您遇到错误:

const fooIsRightType: FooFuncType = foo; // error
//    ~~~~~~~~~~~~~~ <-- string is not assignable to number
// or
type FooIsRightType<T extends FooFuncType = typeof foo> = true; // error
//   -------------------------------------> ~~~~~~~~~~
// (s: string, i: number)=>string does not satisdy FooFuncType

希望有所帮助;祝你好运!

Link to code