Node.js 避免使用类型';{}';不可分配给类型';X';

Node.js 避免使用类型';{}';不可分配给类型';X';,node.js,typescript,typescript-typings,Node.js,Typescript,Typescript Typings,我正在将JavaScript项目迁移到TypeScript。 在TS中使用节点模块(如)会给我带来一些麻烦: import nodeUrl = require('url'); // ... // this worked fine in JS nodeUrl.format({ // just for demonstration x: this.getX(someObj), y: this.getY(someObj) }); 结果: 类型“{}”不可分配给类型“st

我正在将JavaScript项目迁移到TypeScript。
在TS中使用节点模块(如)会给我带来一些麻烦:

import nodeUrl = require('url');
// ...
// this worked fine in JS 
nodeUrl.format({
     // just for demonstration
     x: this.getX(someObj),
     y: this.getY(someObj)
});
结果:

类型“{}”不可分配给类型“string”

这是由于该模块函数的定义来自@types/node/index.d.ts

declare module "url" {
    export interface Url {
        href?: string;
        protocol?: string;
        auth?: string;
        hostname?: string;
        port?: string;
        host?: string;
        pathname?: string;
        search?: string;
        query?: string | any;
        slashes?: boolean;
        hash?: string;
        path?: string;
    }

    export function parse(urlStr: string, parseQueryString?: boolean, slashesDenoteHost?: boolean): Url;
    export function format(url: Url): string;
    export function resolve(from: string, to: string): string;
}

我的问题是,在不更改声明文件的情况下,如何避免/修复此错误

import nodeUrl = require('url');

declare module "url" {
    export function format(url: Url): string;
    export function format(x: any, y: any): string;
    export function format(url: any): string;
}

有关这方面的更多信息,请参见。

您可以使用索引签名:

export function format(url: {[index: string]: string}): string

这将使
format
仍然需要一个带有字符串键和值的对象,但是键名可以是任何东西。当然,您可以根据需要混合和匹配这些类型。

找到了另一种解决方法:

nodeUrl.format(<any> {
     // just for demonstration
     x: this.getX(someObj),
     y: this.getY(someObj)
});
节点格式({
//只是为了示范
x:this.getX(someObj),
y:这是我的名字(someObj)
});

您想做什么,使
格式
可以接受任意键?我可能能够回答这个问题。我希望编译器忽略这样一个事实:我将一个JSON对象传递给
format
方法,该方法需要一个
Url
对象。或者一种将我的JSON转换为
Url
对象的方法(取决于哪种方法更干净/更容易)。因此,如果我做对了,这将“覆盖”现有声明?您不应该覆盖它,而应该扩展它。你想保留现有的定义,但要添加到定义中,但是你失去了类型安全性。我也会使用你的方法,无论如何,在我的情况下,我可以接受。我的方法说,你添加适合某些类型的签名(当然,它也需要适合实际的实现)。你应该避免使用
any
,我只是用它来表示你可以添加签名。