You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何为React-Admin的useDataProvider Hook添加自定义方法的正确类型定义?

解决React Admin中自定义DataProvider方法的类型提示问题

这问题我之前在适配React Admin自定义数据提供器的时候也碰到过——核心原因就是React Admin的默认DataProvider类型里没有包含你新增的get方法,所以通过useDataProvider拿到的实例会被TS识别成默认类型,自然就没有正确的类型提示了。分你正在用的3.14版本和即将升级的4.x版本分别说解决方案:

针对React Admin 3.14版本

1. 定义自定义DataProvider类型

首先要创建一个继承自默认DataProvider的自定义接口,把你的get方法加进去:

import { DataProvider, QueryParams } from 'react-admin';

// 扩展默认的DataProvider类型,添加自定义get方法
export interface CustomDataProvider extends DataProvider {
  get: <T = any>(resource: string, params: Partial<QueryParams>) => Promise<{ data: T }>;
}

2. 给你的DataProvider实例指定类型

在创建数据提供器对象的时候,明确标注它的类型为CustomDataProvider,确保TS能识别到自定义方法:

// 假设你之前的apiUrl和httpClient已经定义好
export const dataProvider: CustomDataProvider = {
  // 保留React Admin要求的默认方法(getList, getOne, create等)
  getList: (resource, params) => { /* 原有实现 */ },
  getOne: (resource, params) => { /* 原有实现 */ },
  // ...其他默认方法

  // 你的自定义get方法
  get: async <T = any>(resource: string, params: Partial<QueryParams>): Promise<{ data: T }> => { 
    const url = `${apiUrl}/${resource}?${stringify(params)}` 
    return httpClient(url) 
      .then(({ json }) => ({ data: json })) 
      .catch((e) => { 
        console.log(e) 
        return Promise.reject(e) 
      }) 
  },
};

3. 让useDataProvider返回正确类型

默认的useDataProvider返回的是DataProvider类型,所以需要我们做类型适配,有两种方式:

方式一:自定义Hook(简单直接)

自己封装一个Hook,把返回值断言成我们的自定义类型:

import { useDataProvider as useRaDataProvider } from 'react-admin';
import { CustomDataProvider } from './path-to-your-data-provider';

export const useDataProvider = () => {
  return useRaDataProvider() as CustomDataProvider;
};

之后在组件里用这个自定义的useDataProvider就能拿到带正确类型提示的实例了。

方式二:模块扩展(更优雅)

通过TypeScript的模块扩展功能,直接给React Admin的DataProvider接口添加方法,这样默认的useDataProvider也能识别到:

// 可以放在你的dataProvider文件顶部
import { QueryParams } from 'react-admin';

declare module 'react-admin' {
  interface DataProvider {
    get: <T = any>(resource: string, params: Partial<QueryParams>) => Promise<{ data: T }>;
  }
}

针对React Admin 4.x版本

4.x的类型系统做了不少优化,处理起来更顺畅:

1. 同样先定义自定义DataProvider接口

和3.x类似,但4.x的QueryParams导入路径保持不变,仍从react-admin导入:

import { DataProvider, QueryParams } from 'react-admin';

export interface CustomDataProvider extends DataProvider {
  get: <T = any>(resource: string, params: Partial<QueryParams>) => Promise<{ data: T }>;
}

2. 传入自定义DataProvider到Admin组件

当你把标注好类型的dataProvider传给<Admin>组件后,React Admin的useDataProvider会自动推断出正确的类型,不需要额外的类型断言。当然,如果你想更保险,也可以用3.x里的模块扩展方式,直接给默认DataProvider接口添加方法,这样全局都能识别到。

另外,4.x里推荐使用createDataProvider工具来构建数据提供器,但如果你是在现有基础上扩展,上面的方式完全适用。


内容的提问来源于stack exchange,提问作者Heikkisorsa

火山引擎 最新活动