我想为一组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 ++头文件一样。但是在这种情况下,这就是我的需要。)
答案 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
希望有所帮助;祝你好运!