<p dir="auto">currently, there's no way to extend the Schema with statics, because it's being exported as a class. It would require converting to an interface then make the schema class implement the interface. The reason is that mongoose plugins usually apply either to <code class="notranslate">statics</code> member of the Schema, or using <code class="notranslate">Schema.static('name', fn)</code>. Doing a</p>
<div class="highlight highlight-source-ts notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="declare module 'mongoose' {
   export class Schema {
      static paginate(/*...*/);
   }
}"><pre class="notranslate"><span class="pl-k">declare</span> module <span class="pl-s">'mongoose'</span> <span class="pl-kos">{</span>
   <span class="pl-k">export</span> <span class="pl-k">class</span> <span class="pl-smi">Schema</span> <span class="pl-kos">{</span>
      <span class="pl-k">static</span> <span class="pl-c1">paginate</span><span class="pl-kos">(</span><span class="pl-c">/*...*/</span><span class="pl-kos">)</span><span class="pl-kos">;</span>
   <span class="pl-kos">}</span>
<span class="pl-kos">}</span></pre></div>
<p dir="auto">gives a duplicate declaration error. applying the extra methods to the model doesn't seem to work.</p>
<div class="highlight highlight-source-ts notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="export interface IModelTest extends mongoose.Document, ITimestamp, ITest { }

export var TestSchema = new mongoose.Schema({
  /*...*/
});

TestSchema.plugin(require('../modules/pagination'));
/* does 
module.exports = function(Schema) {
  Schema.static('pagination', function(){
    return this.paginate({hide: {$ne: true}}, 1, 10, { populate: 'user' });
  });
}
*/

export var model = mongoose.model&lt;IModelTest&gt;('Test', TestSchema);

model.pagination; // error "><pre class="notranslate"><span class="pl-k">export</span> <span class="pl-k">interface</span> <span class="pl-smi">IModelTest</span> <span class="pl-k">extends</span> <span class="pl-s1">mongoose</span><span class="pl-kos">.</span><span class="pl-smi">Document</span><span class="pl-kos">,</span> <span class="pl-smi">ITimestamp</span><span class="pl-kos">,</span> <span class="pl-smi">ITest</span> <span class="pl-kos">{</span> <span class="pl-kos">}</span>

<span class="pl-k">export</span> <span class="pl-k">var</span> <span class="pl-smi">TestSchema</span> <span class="pl-c1">=</span> <span class="pl-k">new</span> <span class="pl-s1">mongoose</span><span class="pl-kos">.</span><span class="pl-c1">Schema</span><span class="pl-kos">(</span><span class="pl-kos">{</span>
  <span class="pl-c">/*...*/</span>
<span class="pl-kos">}</span><span class="pl-kos">)</span><span class="pl-kos">;</span>

<span class="pl-smi">TestSchema</span><span class="pl-kos">.</span><span class="pl-en">plugin</span><span class="pl-kos">(</span><span class="pl-en">require</span><span class="pl-kos">(</span><span class="pl-s">'../modules/pagination'</span><span class="pl-kos">)</span><span class="pl-kos">)</span><span class="pl-kos">;</span>
<span class="pl-c">/* does </span>
<span class="pl-c">module.exports = function(Schema) {</span>
<span class="pl-c">  Schema.static('pagination', function(){</span>
<span class="pl-c">    return this.paginate({hide: {$ne: true}}, 1, 10, { populate: 'user' });</span>
<span class="pl-c">  });</span>
<span class="pl-c">}</span>
<span class="pl-c">*/</span>

<span class="pl-k">export</span> <span class="pl-k">var</span> <span class="pl-s1">model</span> <span class="pl-c1">=</span> <span class="pl-s1">mongoose</span><span class="pl-kos">.</span><span class="pl-en">model</span><span class="pl-kos">&lt;</span><span class="pl-smi">IModelTest</span><span class="pl-kos">&gt;</span><span class="pl-kos">(</span><span class="pl-s">'Test'</span><span class="pl-kos">,</span> <span class="pl-smi">TestSchema</span><span class="pl-kos">)</span><span class="pl-kos">;</span>

<span class="pl-s1">model</span><span class="pl-kos">.</span><span class="pl-c1">pagination</span><span class="pl-kos">;</span> <span class="pl-c">// error </span></pre></div>
<p dir="auto">my IEntityModel definition:<br>
<code class="notranslate">interface IEntityModel extends mongoose.Document { }</code><br>
my method fefinition:<br>
<code class="notranslate">create(item: T): Promise&lt;IEnityModel&gt;{ return this._model.create(item); }</code><br>
How can I fix this problem?<br>
here is error tips by VSCODE:</p>
<blockquote>
<p dir="auto">[ts] Type 'Promise' is not assignable to type 'Promise'.<br>
Types of property 'then' are incompatible.<br>
Type '(onFulFill: (result: IEntityModel) =&gt; void | U | Promise, onReject?: (err: any) =&gt; void | U...' is not assignable to type '{ (onfulfilled?: (value: IEntityModel) =&gt; TResult | PromiseLike, onrejected?: (...'.<br>
Type 'Promise' is not assignable to type 'Promise'.<br>
Property 'catch' is missing in type 'Promise'.<br>
(method) mongoose.Model.create(doc: Object, fn?: (err: any, res: IEnityModel) =&gt; void): mongoose.Promise (+3 overloads)</p>
</blockquote>