【问题标题】:Typescript function declaration separate from implementation打字稿函数声明与实现分开
【发布时间】:2019-12-14 10:10:13
【问题描述】:

我想为一组 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++ 头文件。但这就是我在这种情况下需要它的方式。)

【问题讨论】:

    标签: typescript


    【解决方案1】:

    在 typescript 中定义和实现在同一个命名空间中。

    如果你想要一个类型,以及一个满足该类型的实现,它们必须有不同的名称。

    然而,当你导入一个类型时,你可以给它一个别名,允许你在两个不同的文件中使用相同的名字。

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

    【讨论】:

    • 是的,我知道这是一个奇怪的案例。我不打算经常这样做。不过,我对此有一个特殊的用例。鉴于此,如何导入我的类型及其别名并确保我的实现符合该类型?
    • import { a as alias } 是主要语法。要定义使用特定命名空间的函数,请使用 const functionName: functionType = () =&gt; { .. implementation .. };
    【解决方案2】:

    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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-03-26
      • 2016-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-05
      • 1970-01-01
      相关资源
      最近更新 更多