假設我有一個型別Person,其中包含他們的姓名、年齡和他們所有朋友的串列。
type Person = {
name: string;
age: number;
friends: Person[];
}
然后說我有一個函式getFriendsWithSameAge。這個函式只需要 age 屬性就可以完成它需要做的事情。因此,它沒有將其作為引數Person,而是采用MinimalPersonie:
type MinimalPerson = {
age: number;
friends: MinimalPerson[];
}
export function getFriendsWithSameAge(person: MinimalPerson) {
return person.friends.filter(friend => friend.age === person.age);
}
這很好,因為getFriendsWithSameAge在輸入引數方面非常靈活。您可以傳入任何型別的 Person 物件,只要它至少具有age并已friends定義。這是使用 GraphQl 時非常常見的場景。
問題與回傳型別有關。此代碼抱怨:
const person: Person = { name: 'John', age: 32, friends: [...] }
const friend = getFriendsWithSameAge(person)[0];
const name = friend.name; // error, function call destroys typing, doesn't know what name is
我希望我可以通過保留傳入的型別然后回傳它們來用泛型解決這個問題:
export function getFriendsWithSameAge<T extends MinimalPerson>(person T): T['friends'] { // obviously doesn't work
return person.friends.filter(friend => friend.age === person.age);
}
但我似乎無法弄清楚如何輸入回傳型別。
編輯:我上面嘗試的解決方案作業得很好。我的問題是,T['friends']如果 T 可以為空,這是我為了這個問題而遺漏的細節。
打字稿游樂場
uj5u.com熱心網友回復:
實際上,在我的操場上,您的解決方案有效:TypeScript Playground [更新]
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/428692.html
