Пытаясь обернуть голову вокруг дженериков, и задаюсь вопросом, правильно ли я применяю их здесь.
Примите во внимание следующее:
interface NameValuePair {
name: string;
value: string;
}
function flatten(data: NameValuePair[]) {
return data.reduce((obj, pair: NameValuePair) => {
obj[pair.name] = pair.value;
return obj;
}, {});
}
const formData: NameValuePair[] = [
{ name: "firstName", value: "John" },
{ name: "lastName", value: "Doe" }
];
let flattened = flatten(formData);
// { firstName: "John", lastName: "Doe" }
Когда бы ни вызывалась функция, я бы хотелTypescript, чтобы обеспечить использование пользовательского интерфейса, который описывает окончательную структуру данных.Например, при использовании formData
сверху возможный интерфейс может выглядеть следующим образом:
interface ProfileForm {
firstName: string;
lastName: string;
}
Ниже приведена моя попытка использования обобщений:
function flatten<T>(formData: NameValuePair[]): T {
return <T>formData.reduce((obj: T, pair: NameValuePair) => {
obj[pair.name] = pair.value;
return obj;
}, {});
}
let flattened = flatten<ProfileForm>(formData);
let firstName = flattened.firstName;
let age = flattened.age; // typescript error
Он работает, как и ожидалось, нопри тестировании он дает те же результаты, что и:
function flatten(formData: NameValuePair[]) {
return formData.reduce((obj, pair: NameValuePair) => {
obj[pair.name] = pair.value;
return obj;
}, {});
}
let flattened = <ProfileForm>flatten(formData);
let firstName = flattened.firstName;
let age = flattened.age; // typescript error
В этом конкретном случае генерики дают какую-либо выгоду?