避免types“{}”不可分配为键入“X”

我正在将JavaScript项目迁移到TypeScript。
在TS中使用诸如URL之类的节点模块对我造成一些麻烦:

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

结果是:

键入“{}”不能分配给“string”

这是由于该模块function的定义。 从@ 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; } 

有关详细信息可以在模块扩充中find。

你可以使用索引签名:

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

这将使format仍然需要一个带有string键和值的对象,但键名可以是任何东西。 当然,你可以混合和匹配的types,以适应您的需求。

find另一种解决方法:

 nodeUrl.format(<any> { // just for demonstration x: this.getX(someObj), y: this.getY(someObj) });