扩展类型以创建子类型

Extending a Type to Create Child Type

我正在使用 TypeScript,想知道如何实现另一个 child 类型。我不知道如何准确描述我所追求的,所以让我举个例子。

type Person = {
 name: string;
 type: PersonType
}

type Child = Person & {
 type: PersonType.child,
}

enum PersonType {
 adult = "adult",
 child = "child",
}

const people: Person[] = [...];
const children: Child[] = people.filter(p => p.type === PersonType.child);

这是我会使用泛型的东西吗?我认为这是直截了当的,我只是错过了一块。谢谢!

您向枚举添加了多余的 = 符号。

type Person = {
    name: string;
    type: PersonType
}

type Child = Person & {
    type: PersonType.child,
}

enum PersonType {
    adult = "adult",
    child = "child",
}

type TestChild = Person extends Child ? true : false // false
type TestPerson = Child extends Person ? true : false // true


const people: Person[] = [{ name: 'John', type: PersonType.adult }, { name: 'Tim', type: PersonType.child }];
const children: Child[] = people.filter(p => p.type === PersonType.child);

问题是 Child 扩展了 Person,反之则不然。 您不能只对 children 常量使用显式类型 Child[],因为 Person 不会扩展 Child

Here 是一篇关于协方差的有趣文章。

但是,您可以实现所需的行为,只需使用 filter 作为类型保护:

const children: Child[] = people.filter((p):p is Child => p.type === PersonType.child); // ok

更多有趣的例子,你可以找到here