2017-09-13 78 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對於遲到的答案感到抱歉,說你的新問題,我在那裏回答 –

相關問題