【问题标题】:Avoid Type '{}' is not assignable to type 'X'避免类型“{}”不可分配给类型“X”
【发布时间】:2017-03-07 08:13:59
【问题描述】:

我正在将 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)
});

结果:

类型“{}”不可分配给类型“字符串”

这是由于该模块功能的定义。 来自@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;
}

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

【问题讨论】:

  • 你想做什么,让format接受任意键?我也许可以回答这个问题。
  • 我希望编译器忽略我将 JSON 对象传递给需要 Url 对象的 format 方法这一事实。或者将我的 JSON convert 转换为 Url 对象的方法(取决于哪种方法更清洁/更容易)。

标签: node.js typescript typescript-typings


【解决方案1】:

应该是这样的:

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

【讨论】:

  • 如果我做对了,这会“覆盖”现有的声明吗?
  • 你不应该覆盖它,而应该增加它。您想保留现有定义但要添加到它
【解决方案2】:

您可以使用索引签名:

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

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

【讨论】:

    【解决方案3】:

    找到另一种解决方法:

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

    【讨论】:

    • 但是你失去了类型安全
    • 我也愿意接受你的方法,反正我可以接受。
    • 我的方法是添加适合某些类型的签名(当然也需要适合实际实现)。你应该避免使用any,我只是用它来表明你可以添加签名。
    猜你喜欢
    • 2021-03-02
    • 2020-04-02
    • 2019-06-02
    • 2022-09-30
    • 2018-01-04
    • 2020-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多