寻找记录字段中多态的类型(静态鸭子输入)

问题描述 投票:0回答:1

我正在寻找一个在记录字段中是多态的类型,以便它接受包含更多字段的记录,并限制所有涉及的记录在这些额外字段中重合:

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

Playground

在TS中可以吗?

typescript polymorphism record row-polymorphism
1个回答
0
投票

您可以通过添加通用参数来实现。

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

这是有效的,因为泛型类型是从第一个参数(o)推断并解析为

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

现在第二个参数(p)类型应可分配给上述类型。

© www.soinside.com 2019 - 2024. All rights reserved.