2016-03-03 264 views
2

我確實希望在某些半複雜模型的非內核'where'方法中使用類型檢查。例如像:使用帶下劃線的TypeScript類型支持

class User { 
    public name: string; 
    public age: number; 
    public someOtherProperty: any; 
} 

而且我有這樣的moders的名單稱爲用戶

現在,我想所有的用戶名爲「約翰」,用下劃線法「其中」

public getAllJohns():Array<User> { 
    return _.where<User, any>(this.users, { 
     name: 'John' 
    }); 
} 

這沒什麼,但爲什麼我必須丟棄Type Guard?它相當不錯得到的錯誤,當我寫無意中

public getAllJohns():Array<User> { 
    return _.where<User, any>(this.users, { 
     names: 'John' 
    }); 
} 

在創建中的第二個「通用」的說法接口列表,像

interface byName { 
    name: string; 
} 

不是解決辦法,因爲會有很多不同勢方法與不同的所需屬性列表進行檢查。

所以..有沒有人有一個很好的解決方案,或者它更像是應該去像功能請求的TypeScript團隊。

回答

1

不幸的是,你會做需要一些爲where方法的第二個參數指定的那種類型的,如果你想保留類型安全。這可以是一個inline interface,但這並不能真正幫助你。

如果你只關心有需要特定類型的成員的衆多組合,你可以使用一個接口optional members

interface IUser { 
    name?: string; 
    age?: number; 
    someOtherProperty?: any; 
} 

後,它是一個很普通:

public getAllJohns(): Array<User> { 
    return _.where<User, IUser>(this.users, { 
     names: 'John' // Error: Property 'names' does not exist on type 'IUser' 
    }); 
} 
1

第二個參數是一個在用戶界面中定義了一些鍵的對象,對吧?那麼,建立一些具有完全相同的鍵/類型但可選字段的查詢接口是否合適?

class UserCondition { 
    public name?: string; 
    public age?: number; 
    public someOtherProperty?: any; 
} 

再加上嚴格的對象文本檢查(又名新鮮度,https://basarat.gitbooks.io/typescript/content/docs/types/freshness.html),這將有助於使你的查詢更加類型安全。

public getAllJohns():Array<User> { 
    return _.where<User, UserCondition>(this.users, { 
     name: 'John' 
    }); 
}