【发布时间】:2020-03-07 21:35:09
【问题描述】:
我想使用泛型来减少维护,以及维护 Typescript 类型时可能出现的错误。
我有一个名为loadValues 的函数,它接收具有以下示例接口的对象:
interface DashboardPreload: {
studentNames: Observable<string[]>,
seatNumbers: Observable<number[]>
}
并返回一个具有以下非常相似接口的对象。请注意,它具有相同的键,并且键具有相同的值,除了在 DashboardPreload 中,它被包装在一个 Observable 中:
interface DashboardState: {
studentNames: string[],
seatNumbers: number[]
}
所以指定类型如下所示:
function loadValues(preload: DashboardPreload): DashboardState {
// ...
}
为了跨组件重用loadValue 函数,我更改了签名以允许泛型:
loadValues<A, B>(preload: A): B {
// ...
}
state = loadValues<DashboardState, DashboardPreload>(toPreload);
// another component would then do
interface UserDetailPreload: {
name: Observable<string>;
address: Observable<string>;
}
interface UserDetailState: {
name: string;
address: string;
}
otherState = loadValues<UserDetailState, UserDetailPreload>(otherValuesToPreload);
但我仍然想赢得一场巨大的胜利。我的输入和输出对象
- 总是有相同的键
- 和对应的键值类型是相同的,除了在输入对象上,值被包装在一个 Observable 中。
为了避免必须维护非常相似的类型,如果泛型可以指定输入和输出类型之间的上述关系,那就太好了。我想简单地提供一个通用参数(例如输出),并且签名的编写方式可以键入输入和输出:
// How should this signature look?
function loadValues<P>(preload: ?): P {
// ...
}
state = loadValues<DashboardState>(toPreload);
这可能吗?函数签名的外观应该如何(请注意,我不是在询问函数中的逻辑,而是询问如何进行泛型)。
- 诸如 Object.entries() 之类的 Typescript 签名,
- 类似“K extends keyof P”的结构
- 例如:https://medium.com/iqoqo-engineering/two-advanced-techniques-to-make-you-a-typescript-wizard-df42e00b1cf8
但还没有找到解决办法。
【问题讨论】:
标签: javascript angular typescript generics types