避免类型“{}”不可分配给类型 'X'
Avoid Type '{}' is not assignable to type '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)
});
结果:
Type '{}' is not assignable to type '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;
}
我的问题是你如何avoid/fix这个错误而不更改声明文件?
应该是这样的:
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;
}
可以在 Module Augmentation 中找到有关此内容的更多信息。
您可以使用索引签名:
export function format(url: {[index: string]: string}): string
这将使 format
仍然需要一个具有字符串键和值的对象,但键名可以是任何名称。当然,您可以根据需要混合搭配各种类型。
找到另一种修复方法:
nodeUrl.format(<any> {
// just for demonstration
x: this.getX(someObj),
y: this.getY(someObj)
});
我正在将 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)
});
结果:
Type '{}' is not assignable to type '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;
}
我的问题是你如何avoid/fix这个错误而不更改声明文件?
应该是这样的:
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;
}
可以在 Module Augmentation 中找到有关此内容的更多信息。
您可以使用索引签名:
export function format(url: {[index: string]: string}): string
这将使 format
仍然需要一个具有字符串键和值的对象,但键名可以是任何名称。当然,您可以根据需要混合搭配各种类型。
找到另一种修复方法:
nodeUrl.format(<any> {
// just for demonstration
x: this.getX(someObj),
y: this.getY(someObj)
});