[英]Why Typescript mapped type throws a compilation error
我有以下代碼: Typescript Playground Link
class User {
email?: string;
}
type FilterQuery<T> = {
[P in keyof T]?:T[P];
}
interface IUserRepository<TUser extends User> {
findOne(filter: FilterQuery<TUser>): TUser;
}
class UserService<TUser extends User> {
constructor(private userRepository: IUserRepository<TUser>) {
}
getUser(email: string) {
this.userRepository.findOne({ email: email });
}
}
我收到以下編譯錯誤:
'{ email 類型的參數:字符串; }' 不可分配給“FilterQuery”類型的參數。
我什至在{ email: email }
上得到了正確的自動完成,所以我不確定我做錯了什么。
問題是通用TUser extends User
。 如果它只是沒有通用的User
,那么就沒有錯誤。
當您允許TUser
成為擴展User
的東西時,您允許TUser
具有email
的定義,這比string
更具體。
假設UserService
實例的通用TUser
是{ email: 'literalstring@gmail.com'; }
{ email: 'literalstring@gmail.com'; }
。 這確實擴展了User
,所以那里沒有問題。 但是,如果您要調用getUser('differentstring@gmail.com')
,那么您將得到一個無效的FilterQuery
。 並非所有string
值在這里都有效。 'literalstring@gmail.com'
是此實例的FilterQuery
的唯一有效值。
如果UserService
沒有正當理由成為通用 class,則刪除 generics 並將您的存儲庫類型基於User
。
(注意:我原以為將 getUser 的簽名更改為getUser
getUser(email: Required<TUser>['email'])
會在保持通用性的同時修復它,但它仍然會出錯,我無法真正解釋為什么)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.