Поиск типа polymorphi c в полях записи (stati c duck typing) - PullRequest
0 голосов
/ 18 апреля 2020

Я ищу тип polymorphi c в полях записей, чтобы он мог принимать записи, содержащие больше полей, с ограничением на совпадение всех задействованных записей в этих дополнительных полях:

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 Ответ

1 голос
/ 18 апреля 2020

Этого можно достичь, добавив параметр generi c.

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; }'

Playground

Это работает, поскольку тип generi c выводится из первого аргумента. (o) и разрешается в

{ first: string, last: string, age: number }

Теперь тип второго параметра (p) должен быть назначен вышеуказанному.

...