扩展类型以创建子类型
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
我正在使用 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