【问题标题】:How to override or extend a libary type definition in Typescript如何在 Typescript 中覆盖或扩展库类型定义
【发布时间】:2017-05-13 10:46:49
【问题描述】:

如果我在 Typescript 中导入库类型声明。当存在编译器问题时,如何扩展该库的定义,但否则它将是有效的 js 代码?例如 validate.js 类型绑定与实际实现相比非常不准确。如下图所示......

import * as validate from 'validate.js';

declare namespace validate {
  Promise: any;
  async: any;
}

与 mongoose 类似,我无法访问 modelSchemas 属性,但我需要。

import * as mongoose from 'mongoose';
declare namespace mongoose {
  export modelSchemas any[];
}

因此,如果我想向现有类型添加定义只是为了关闭编译器。我该怎么做?

【问题讨论】:

    标签: typescript


    【解决方案1】:

    custom-typings.d.ts 的根src 中添加其他类型。

    custom-typings.d.ts

    import * as mongoose from "mongoose";
    
    //augment validate.js
    declare module "validate.js" {
        let Promise: any;
        function async(param: any): any;
    }
    
    //augment mongoose
    declare module "mongoose" {
        let modelSchemas: mongoose.Schema[]
    }
    

    my-module.ts

    import validate = require("validate.js");
    import mongoose = require("mongoose");
    import * as Bluebird from "bluebird";
    
    validate.Promise = Bluebird;
    mongoose.Promise = Bluebird;
    
    let schema = new mongoose.Schema({
        name: String
    });
    
    mongoose.modelSchemas = [schema];
    
    validate.async("foo");
    

    Why import with ES5 syntax (require)? ES6 模块及其属性是不变的。

    【讨论】:

    • 感谢它几乎可以为 validate.js 工作,但它现在给出错误:“无法分配给 'Promise',因为它是一个常量或只读属性” - 但其他人已经解决了。另外如何向 mongoose.Mongoose 添加属性?我尝试了类似的方法,但语法不正确。
    • 请查看编辑后的答案。还有一些额外的果汁 - mongoose 将使用 Bluebird 作为 Promise 库。
    • 好的,谢谢 mongoose 和 validate.js 错误现在已经解决。感谢您的帮助。
    • 似乎无法得到您的答案来处理我的案例stackoverflow.com/questions/67836379/…
    猜你喜欢
    • 1970-01-01
    • 2018-07-21
    • 2018-05-18
    • 2019-09-29
    • 2023-01-04
    • 2019-10-17
    • 1970-01-01
    • 2022-11-05
    • 1970-01-01
    相关资源
    最近更新 更多