避免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) });