簡體   English   中英

為什么Typescript映射類型會拋出編譯錯誤

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM