![](/img/trans.png)
[英]Why does mongoose model's hasOwnProperty return false when property does exist?
[英]Property does not exist on a function's return value of multiple types
我正在使用typescript來編寫NodeJS程序。
在這個程序中,我導入了一個名為ts-md5
的節點模塊,其中有一個函數hashStr()
,它可以返回一個string
或Int32Array
的值。
我需要在我的程序中做這樣的事情:
Md5.hashStr(str).toUpperCase();
但是,編譯器抱怨錯誤:
error TS2339: Property 'toUpperCase' does not exist on type 'string | Int32Array'.
該程序成功運行。 因為它總是在運行時返回string
。 但我想知道是否有辦法擺脫這個惱人的錯誤?
您可以使用類型保護或類型斷言。
打字衛士
let hash = Md5.hashStr(str);
if (typeof hash === 'string') {
hash = hash.toUpperCase();
}
類型斷言
let hash = (<string>Md5.hashStr(str)).toUpperCase();
該型后衛的好處是,它在技術上更加安全-因為如果你做過得到的東西,這不是在運行時的字符串,它仍然能工作。 類型斷言只是覆蓋編譯器,因此它在技術上並不安全,但它完全被擦除,因此導致您遇到錯誤時的運行代碼相同。
static hashStr(str: string, raw?: boolean): string | Int32Array;
看看實現 ,似乎當raw
為true時返回Int32Array
,否則返回string
。
鑒於該聲明,您不能比使用類型斷言做得更好:
let hash = (Md5.hashStr(str) as string).toUpperCase()
表達返回類型的正確方法取決於TypeScript中的參數是通過重載聲明 。 這樣的事情應該有效:
static hashStr(str: string): string;
static hashStr(str: string, raw: false): string;
static hashStr(str: string, raw: true): Int32Array;
static hashStr(str: string, raw: boolean): Int32Array | string;
static hashStr(str: string, raw?: boolean): string | Int32Array {
// implementation goes here...
}
我建議在ts-md5上發布一個關於此的問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.