How to override or extend a libary type definition in Typescript

typescript

Solution

Put additional typings in `custom-typings.d.ts` in root of `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 modules and their properties are constant.

Problem

If I import a library type declaration in Typescript. How can I extend the definition of that library when there's compiler issues with it, but it would be otherwise valid js code? For example validate.js type bindings are very inaccurate compared to the actual implementation. Something like shown below.... ``` import * as validate from 'validate.js'; declare namespace validate { Promise: any; async: any; } ``` Similarly with mongoose I can't access modelSchemas property but I need to. ``` import * as mongoose from 'mongoose'; declare namespace mongoose { export modelSchemas any[]; } ``` So if I want to add definitions to the existing types just to shut the compiler up. How can I do that?

Original source

Related problems