gpt4 book ai didi

javascript - typescript 泛型 : Use output argument type to build input argument type

转载 作者:行者123 更新时间:2023-12-02 22:33:31 25 4
gpt4 key购买 nike

我想使用泛型来减少维护,以及维护 Typescript 类型时可能出现错误的机会。

我有一个名为 loadValues 的函数,它接受具有以下示例接口(interface)的对象:

interface DashboardPreload: {
studentNames: Observable<string[]>,
seatNumbers: Observable<number[]>
}

并返回一个具有以下非常相似的接口(interface)的对象。请注意,它具有相同的键,并且键具有相同的值,除了在 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);

但我仍然想获得一场巨大的胜利。我的输入和输出对象

  1. 始终拥有相同的 key
  2. 和相应的键值类型相同,只是在输入对象上,值被包装在 Observable 中。

为了避免维护非常相似的类型,如果泛型能够指定上述输入和输出类型之间的关系,那就太好了。我想简单地提供一个通用参数(例如输出),并且签名的编写方式将键入输入和输出:

// How should this signature look?
function loadValues<P>(preload: ?): P {
// ...
}
state = loadValues<DashboardState>(toPreload);

这可能吗?函数签名应该是什么样的(请注意,我不是在询问函数中的逻辑,而是在询问如何进行泛型)。

  1. 诸如 Object.entries() 之类的 typescript 签名,
  2. 类似“K extends keyof P”的结构
  3. 例如:https://medium.com/iqoqo-engineering/two-advanced-techniques-to-make-you-a-typescript-wizard-df42e00b1cf8

但尚未找到解决方案。

最佳答案

您可以添加这样的预加载类型:

type Preload<T> = {
[P in keyof T]: Observable<T[P]>;
};
function loadValues<P>(preload: Preload<P>): P {
// ...
}
state = loadValues<DashboardState>(toPreload);

关于javascript - typescript 泛型 : Use output argument type to build input argument type,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58814216/

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