gpt4 book ai didi

typescript - 在 Typescript 中重载全局函数时的引用模块

转载 作者:搜寻专家 更新时间:2023-10-30 21:01:37 26 4
gpt4 key购买 nike

我正在使用 moment.js (特别是 moment-timezone),它有一个名为 Duration 的接口(interface)。 Duration.prototype.valueOf() 返回一个数字,所以在 JavaScript 中,调用

setInterval(myCallback, moment.duration(30, 'seconds'));

工作得很好。

我想编写一个允许这样做的 TypeScript 声明文件。

global.d.ts

export {};

declare global {
function setTimeout(callback: (...args: any[]) => void, ms: Duration, ...args: any[]): NodeJS.Timeout;

function setInterval(callback: (...args: any[]) => void, ms: Duration, ...args: any[]): NodeJS.Timeout;
}

当我前置

import { Duration } from 'moment-timezone';

它将 .d.ts 文件视为模块声明,因此它不会影响全局命名空间。

我想将 import 移动到 declare global 范围内,但它仍然将 Duration 视为 any .

我也试过

/// <reference path="node_modules/@types/moment-timezone/index.d.ts" />

但这似乎并没有做任何事情。

我看到一些答案提到了一些关于 tsconfig.json 中的设置的内容,但这对我来说不是一个选项,而且这看起来真的应该首先成为可能。

最佳答案

这需要两个步骤:

  1. declare global 范围之外声明模块。
  2. import 放在 declare global 范围内。

对于 OP 示例:

export {}

declare module 'moment-timezone';

declare global {
import { Duration } from 'moment-timezone';

function setTimeout(callback: (...args: any[]) => void, ms: Duration, ...args: any[]): NodeJS.Timeout;

function setInterval(callback: (...args: any[]) => void, ms: Duration, ...args: any[]): NodeJS.Timeout;
}

如果你想将自己的类型导入到外部模块中,请将 import 放在 declare module 范围内,并确保你的类型在 声明自己的模块范围。

typings/my-custom-types.d.ts

declare module 'my-custom-types' { // <-- this was the missing line that was giving me trouble
export interface MyStringInterface {
valueOf(): string;
}
}

typings/some-lib/index.d.ts

declare module 'some-lib' {
import { MyStringInterface } from 'my-custom-types';

export interface SomeExistingClass {
// Add your own signatures
someExistingMethod(stringParam: MyStringInterface): any;
}
}

关于typescript - 在 Typescript 中重载全局函数时的引用模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53907521/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com