繁体   English   中英

如何在 TypeScript 中覆盖标准库 function 的类型?

[英]How do I override type of a standard library function in TypeScript?

我正在开发一个 polyfill,它通过向 reviver 回调 function 添加可选的第三个参数来扩展JSON.parse() function 的行为。

polyfill 应该像这样为最终用户导入:

import 'my-polyfill';

JSON.parse()node_modules/typescript/lib/lib.es5.d.ts中定义如下:

// lib.es5.d.ts

interface JSON {

  // …

  parse(
    text: string,
    reviver?: (this: any, key: string, value: any) => any
  ): any;

  // …

}

如何覆盖此定义,以便在安装/导入 polyfill 时使用我的定义? 例如:

interface ContextType {
  // …
}

interface JSON {

  parse<Type = any>(
    text: string,
    reviver?: (
      key: string,
      value: any,
      context?: ContextType
    ) => any

  ): Type;

}

您可以创建声明文件并将其命名为polyfill.d.ts等。 然后,您应该使用标准方式扩展全局类型,如下所示:

declare global {
  interface JSON {
    // Here, you should write your own implementation of `parse` function.
    parse(variable: string): void;
  }
}

export {};

export是 TypeScript 所必需的,您可以在答案及其评论中了解更多信息。

不要忘记,当您创建一个单独的库时,该文件应该存在于最终构建目录中。 因此,当某些用户安装您的 package 并导入它时,文件polyfill.d.ts将由 TypeScript 自动应用。

我不确定您是否能够制作具有自己功能的 TypeScript 传输声明文件 ( .d.ts )。 为此,我们应该使用此处描述的一些 hack。 我们应该将文件命名为polyfill.ts而不是polyfill.d.ts并将其导入到库的index.ts文件中,这样它将被 TypeScript 导入并传输到构建目录。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM