从 js 中隐藏函数(仅打字稿函数)

Hide function from js (typescript only function)

我有一个 javascript 库,它通过 index.d.ts 定义类型。我想为 javascript 公开一个不同于打字稿的 API。

似乎如果你想从打字稿中隐藏一些东西,你可以不在 .d.ts 文件中定义它。是否可以反过来做?据我所知, .d.ts 文件只能有定义,没有实现。有没有办法在 .d.ts 或其他方式中实现仅打字稿功能?

例如,我想公开一个仅供 js 使用的通用 get() 函数,以及仅为 typescript 定义的类型化 getString 和 getInt 包装器。

index.d.ts

declare module 'example' {
  export function getConfig(): Config;

  export interface Config {
    // have these wrap get() and return null if the type is wrong
    getString(name: string): string | null; 
    getInt(name: string): int | null;
  }
}

index.js

module.exports = {
  getConfig() {
    return new Config({
      testString: "test",
      testInt: 12,
    })
  }
}

Config.js

class Config {
  constructor(configObject) {
    this.configObject = configObject;
  }

  get(index) {
    return this.configObject?[index];
  }
}

这在概念上是不可能的,因为在运行时没有打字稿! 您的打字稿被编译为 javascript。这些类型基本上只是被删除了。 也没有办法真正从 typescript 中隐藏一些东西。仅仅因为您没有类型并不能阻止您调用函数。

但是,如果您只希望它用于正确输入,那么正确的方法就是泛型。所以如果你有一个 get() 函数,你可以这样输入它:

function getIt<T extends String | Number>(name: string) : T {
  ...
}

然后你可以像 getIt<Number>("...") 来自 ts 或只是 getIt("...") 来自 js.