gpt4 book ai didi

typescript - 如何让 Typescript 识别联合中两个相同类型接口(interface)之间的通用共性?

转载 作者:行者123 更新时间:2023-12-05 07:00:56 25 4
gpt4 key购买 nike

我列出了几种类型:

interface Person {
name: string;
}
interface Core<T> {
fnc: (arg: T) => void;
args: T;
}
interface One extends Core<Person> {
type: 'modifyPerson';
}
interface Two extends Core<Person & { age: number }> {
type: 'modifyAgeingPerson';
}

然后我有一个函数可以处理修改一个人或一个老年人的共享属性 - 因此它有一个联合类型,一个例子如下:

modifyPersonCharacteristics(person: One | Two) {
person.fnc({ ...person.args, name: 'Steven' });
}

然而,Typescript 不喜欢这样,因为存在类型重叠 - 但在这种情况下,因为使用了泛型,它应该重要吗? One 或 Two 的实例都可以接受传递的参数。

有没有办法让 typescript 看到泛型的大图?

旁注是以下内容有效,但出于显而易见的原因我宁愿不这样做:

modifyPersonCharacteristics(person: One | Two) {
if (person.type === 'modifyPerson') {
person.fnc({ ...person.args, name: 'Steven' });
} else {
person.fnc({ ...person.args, name: 'Steven' });
}
}

最佳答案

我认为您的问题是您对 fnc 的参数定义过于狭窄。关于大局的观点——关键是你的 fnc 将与任何扩展(或相交)Person 的类型一起工作,所以它只需要这样声明

interface Person {
name: string;
}
interface Core<T> {
fnc: (arg: Person) => void; //This is the line that's changed.
args: T;
}
interface One extends Core<Person> {
type: 'modifyPerson';
}
interface Two extends Core<Person & { age: number }> {
type: 'modifyAgeingPerson';
}

function modifyPersonCharacteristics(person: One | Two) {
person.fnc({ ...person.args, name: 'Steven' });
}

Playground here .

关于typescript - 如何让 Typescript 识别联合中两个相同类型接口(interface)之间的通用共性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63979037/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com