Ищем тип, который является полиморфным в полях записи (статическая утка)
Я ищу тип, который является полиморфным в полях записей, чтобы он принимал записи, содержащие больше полей с ограничением, что все задействованные записи совпадают в этих дополнительных полях:
type foo = { first: string, last: string };
const o = { first: "Foo", last: "Oof", age: 30 };
const p = { first: "Bar", last: "Rab", age: 45 };
const q = { first: "Baz", last: "Zab", gender: "m" };
const main = (o: foo) => (p: foo) => o.first + o.last
// goal
main(o)(p); // type checks
main(o)(q); // type error
Возможно ли такое в TS?
1 ответ
Решение
Вы можете добиться этого, добавив общий параметр.
const main = <T extends foo>(o: T) => (p: T) => o.first + o.last
main(o)(p); // allowed
main(o)(q); // Property 'age' is missing in type '{ first: string; last: string; gender: string; }'
Это работает, потому что универсальный тип выводится из первого аргумента (o
) и решил
{ first: string, last: string, age: number }
Теперь второй параметр (p
) тип должен быть назначен указанному выше.