如何使用 RTK 查询和打字稿使查询挂钩 return 类型取决于参数类型?
How do I make a query hook return type depend on parameter type using RTK query and typescript?
我正在为 UI 开发使用 React 制作一个程序。该程序旨在访问文件系统以进行设置,因此我 运行 节点中的一些服务器代码并使用 RTK 查询与该代码进行通信。
一些服务器代码从 xml 文件中读取一个值。我在定义请求和响应参数类型的服务器代码中定义了这些接口:
// define the key and value pairing for the file
export interface PersistentFileValues {
initialValue: number;
repaymentChanges: DatedValue[];
}
// queries should provide a key that matches the pairing
export interface GetPersistentFileValueRequestQuery {
itemKey: keyof PersistentFileValues;
}
// define type that gets the value type given a key
export type PersistentFileValue<T extends keyof PersistentFileValues> =
PersistentFileValues[T];
// make GetPersistentFileValueResponseBody depend on GetPersistentFileValueRequestQuery
export interface GetPersistentFileValueResponseBody<
T extends GetPersistentFileValueRequestQuery
> {
value: PersistentFileValue<T['itemKey']>;
}
如果我使用 createApi,并且有一个名为 getPersistentFileValue 的端点,我该如何进行输入,以便挂钩根据作为参数提供的密钥找出 return 类型?
目前我有:
endpoints: (builder) => ({
getPersistentFileValue: builder.query<
PersistentFileValue<keyof PersistentFileValues>,
GetPersistentFileValueRequestQuery
>({
query: (queryData) => {
return {
url: constructGetPersistentFileValueUrl(queryData), // appends the data as a string to the url
method: 'get',
};
},
transformResponse: (result, _meta, arg) => {
const out = result as GetPersistentFileValueResponseBody<typeof arg>;
return out.value;
},
}),
...
似乎没有任何类型错误。但是,当我使用钩子时:
const { data: repaymentChanges } = useGetPersistentFileValueQuery({
itemKey: 'repaymentChanges',
});
我发现 repaymentChanges 的类型太笼统了,如果我尝试获取长度 属性,我会收到错误消息 属性。
我如何输入内容以便挂钩让我访问正确类型的数据?有更好的方法吗?
在此之前,我为从文件访问的每个值创建了一个端点,但这看起来很笨拙。
由于 RTK 查询在内部映射类型以创建那些新函数签名,任何类型的 generics/overloads 都会丢失。您最好的选择是使用 RTK Query-generated 挂钩,将其包装在您自己的函数中并为此提供重载。
我正在为 UI 开发使用 React 制作一个程序。该程序旨在访问文件系统以进行设置,因此我 运行 节点中的一些服务器代码并使用 RTK 查询与该代码进行通信。
一些服务器代码从 xml 文件中读取一个值。我在定义请求和响应参数类型的服务器代码中定义了这些接口:
// define the key and value pairing for the file
export interface PersistentFileValues {
initialValue: number;
repaymentChanges: DatedValue[];
}
// queries should provide a key that matches the pairing
export interface GetPersistentFileValueRequestQuery {
itemKey: keyof PersistentFileValues;
}
// define type that gets the value type given a key
export type PersistentFileValue<T extends keyof PersistentFileValues> =
PersistentFileValues[T];
// make GetPersistentFileValueResponseBody depend on GetPersistentFileValueRequestQuery
export interface GetPersistentFileValueResponseBody<
T extends GetPersistentFileValueRequestQuery
> {
value: PersistentFileValue<T['itemKey']>;
}
如果我使用 createApi,并且有一个名为 getPersistentFileValue 的端点,我该如何进行输入,以便挂钩根据作为参数提供的密钥找出 return 类型?
目前我有:
endpoints: (builder) => ({
getPersistentFileValue: builder.query<
PersistentFileValue<keyof PersistentFileValues>,
GetPersistentFileValueRequestQuery
>({
query: (queryData) => {
return {
url: constructGetPersistentFileValueUrl(queryData), // appends the data as a string to the url
method: 'get',
};
},
transformResponse: (result, _meta, arg) => {
const out = result as GetPersistentFileValueResponseBody<typeof arg>;
return out.value;
},
}),
...
似乎没有任何类型错误。但是,当我使用钩子时:
const { data: repaymentChanges } = useGetPersistentFileValueQuery({
itemKey: 'repaymentChanges',
});
我发现 repaymentChanges 的类型太笼统了,如果我尝试获取长度 属性,我会收到错误消息 属性。
我如何输入内容以便挂钩让我访问正确类型的数据?有更好的方法吗?
在此之前,我为从文件访问的每个值创建了一个端点,但这看起来很笨拙。
由于 RTK 查询在内部映射类型以创建那些新函数签名,任何类型的 generics/overloads 都会丢失。您最好的选择是使用 RTK Query-generated 挂钩,将其包装在您自己的函数中并为此提供重载。