2017-09-13 79 views
0

我在Date对象上创建了一个基本的扩展,它工作正常。下面是我的代码:'MyObject'类型不存在属性 - Typescript扩展

date.extensions.ts

export {} 

declare global { 
    interface Date { 
     toSQLiteString(): string; 
    } 
} 

Date.prototype.toSQLiteString = function() { 
    let tzo = -this.getTimezoneOffset(); 
    let dif = tzo >= 0 ? '+' : '-'; 
    let pad = function(num) { 
     let norm = Math.abs(Math.floor(num)); 
     return (norm < 10 ? '0' : '') + norm; 
    }; 

    return this.getFullYear() + 
     '-' + pad(this.getMonth() + 1) + 
     '-' + pad(this.getDate()) + 
     'T' + pad(this.getHours()) + 
     ':' + pad(this.getMinutes()) + 
     ':' + pad(this.getSeconds()) + 
     dif + pad(tzo/60) + 
     ':' + pad(tzo % 60); 
}; 

现在,我想创建一个自定义对象上的扩展文件,让我们把它叫做为MyModel。这个对象在另一个文件中定义的,看起来像这样(很简单的例子)

export class MyObject { 
    id: number = 0; 
    name: string = '' 
} 

现在我想创建一个名为MyObject.extensions.ts,并具有扩展功能的文件,所以我创造了这个和该文件看起来像这样

import { MyObject } from './my-object.ts' 

export {} 

declare global { 
    interface MyObject { 
     getIdAndName(): string; 
    } 
} 

MyObject.prototype.getIdAndName = function() { 
    return this.id + ' - ' + this.name; 
}; 

但是,出于某种原因,我感到打字稿得到一个错误

enter image description here

但是,如果我在文件的顶部去除import,错误消失,但我得到一个不同的错误,如下面

enter image description here

我用的打字稿2.4.2

任何建议大加赞赏

+0

您可能会对接口和类给予不同的名称。你不能修改类型。你的课是一个价值,可以修改。 –

回答

1

你的类不是在全局命名空间是一个模块中,你应该扩展模块声明:

import { MyObject } from './my-object' 

export {} 

declare module './my-object' { 
    interface MyObject { 
     getIdAndName(): string; 
    } 
} 

MyObject.prototype.getIdAndName = function() { 
    return this.id + ' - ' + this.name; 
}; 

也从模块导入中删除.ts扩展名。

+0

这个作品谢谢你。虽然你知道你是否可以扩展一个对象并获得在基础对象上声明的扩展的功能?虽然这编译,当我运行它它说,“新”的对象不具有该功能......当它在基础对象上声明 – Gillardo

+0

@Gillardo对于迟到的答案感到抱歉,说你的新问题,我在那里回答 –

相关问题