2017-05-04 12 views
0

我剛開始玩Angular 2和Typescript,最近遇到一些我覺得很奇怪的行爲。Typescript:當類中存在函數時,不能使用對象字面值實例化對象

我的類看起來是這樣的:

export class Person{ 
    id: number; 
    name: string; 
    height: number; 
    weight: number; 

    calculateBmi() { 
    return (weight/(height*height)); 
    } 
} 

當使用對象字面實例化一個新的人,像這樣的:在Visual Studio 2017年說

person: Person = { 
    id: 1, 
    name: "Jack Johnson", 
    height: 180, 
    weight: 70 
    }; 

我得到了(設計時)錯誤:

類型 '{ID:號碼,姓名:字符串,高度:數,重量:數}' 不是分配給鍵入 '人' 物業 'calculateBmi' 中缺少類型 '{ID:編號,名稱:字符串,身高:件數,重量:數}'

它還說,它

無法將類型「{ id:number,name:string,height:number,weight:number}'鍵入'Person':類型'Person'具有非可選屬性'calculateBmi',它不存在於類型'{id:number,name:string ,身高:數量,體重:數量}'。

因此,似乎轉譯員將'calculateBmi'視爲屬性而不是函數。 解決方法當然是添加一個構造函數並使用它來實例化該類,但我想知道是否有任何方法可以解決這個問題,這樣我仍然可以使用對象文字?

感謝名單, 喬恩

BTW:我使用ReSharper的2017.x但我不是這樣,這是什麼導致出現錯誤信息。

+0

你告訴那個人應該是塔伊人的TS。 Person類型聲明瞭一個方法calculateBmi。所以,每次你有一個Person實例時,你都應該能夠在該實例上調用calculateBmi()。但是你的對象文字沒有這樣的方法。所以你試圖在腳下拍攝自己,而TypeScript會阻止你這樣做。正如你所說,只需調用構造函數。 –

回答

1

您的實例化是錯誤的。無論是調用新的

person: Person = new Person() 

構造函數或創建一個完整的對象字面

person: Person = { 
    id: 1, 
    name: "Jack Johnson", 
    height: 180, 
    weight: 70, 
    calculateBmi: function() {...} 
    }; 
+0

感謝getjackx,但這意味着我每次實例化類時都必須定義函數。 這遠不是最優的,但可能是使用對象文字進行折衷......? – YonZo

+0

爲什麼你要使用對象文字呢?如果有必要,你可以寫一個接受文字的構造函數。或者你不想在課堂上使用這個功能。如果需要,您可以編寫控制器或服務。 – getjackx

+0

好吧,我只是試圖去掌握語言。 – YonZo