typescript修改npm包的类型定义
我们在使用TS进行开发的时候有时候会遇到第三方库的类型限制导致TS校验不同的情况,这样就需要我们自己重新去定义这个第三库的类型声明文件,今天遇到这个坑,记录一下解决办法。
正常的一个TS文件如下,就是页面展示一个日期选择器,用的组件是三方库 chakra-dayzed-datepicker
import { RangeDatepicker } from 'chakra-dayzed-datepicker'
function Demo(){
const [timeDate, setTimeDate] = useState<Date[]>([new Date('2023/08/10'),new Date('2023/09/10')])// 填充默认时间
return <RangeDatepicker selectedDates={timeDate}/>
}
需求背景
进入页面的初始化时候,默认日期为空
一分钟搞定
import { RangeDatepicker } from 'chakra-dayzed-datepicker'
function Demo(){
const [timeDate, setTimeDate] = useState<Date[]|undefined[]>([,])// 填充默认时间为空
return <RangeDatepicker selectedDates={timeDate}/>
}
但是,RangeDatepicker 这个组件就报错了
不能将类型“Date[] | undefined[]”分配给类型“Date[]”。
不能将类型“undefined[]”分配给类型“Date[]”。
不能将类型“undefined”分配给类型“Date”
现在问题变成怎么修改 *** chakra-dayzed-datepicker*** 的声明类型
import React from 'react';
import { Props as DayzedHookProps } from 'dayzed';
import { CalendarConfigs, DatepickerConfigs, DatepickerProps, PropsConfigs } from './utils/commonTypes';
interface RangeCalendarPanelProps {
dayzedHookProps: DayzedHookProps;
configs: CalendarConfigs;
propsConfigs?: PropsConfigs;
selected?: Date | Date[];
}
export declare const RangeCalendarPanel: React.FC<RangeCalendarPanelProps>;
export interface RangeDatepickerProps extends DatepickerProps {
selectedDates: Date[];
configs?: DatepickerConfigs;
disabled?: boolean;
defaultIsOpen?: boolean;
closeOnSelect?: boolean;
onDateChange: (date: Date[]) => void;
id?: string;
name?: string;
usePortal?: boolean;
}
export declare const RangeDatepicker: React.FC<RangeDatepickerProps>;
export {};
直接修改NPM包肯定是不行的,这NPM部署安装一下就是新的所以我们需要
重新定义一下RangeDatepickerProps
具体步骤如下
1.在项目tsconfig.json同级目录新建一个types目录
2.创建文件RangeDatepicker.d.ts
3.修改tsconfig.json配置的compilerOptions属性指定chakra-dayzed-datepicker的申明文件
"compilerOptions": {
"paths": {
"chakra-dayzed-datepicker": ["./types/rangeDatepicker"]
}
},
rangeDatepicker.d.ts文件内容如下
//rangeDatepicker.d.ts
import { RangeDatepickerProps as LibRangeDatepickerProps } from 'chakra-dayzed-datepicker/src/'
// 导出RangeDatepickerProps
export * from 'chakra-dayzed-datepicker'// 默认接口导出
type RangeDatepickerPropsLess = Omit<LibRangeDatepickerProps, 'selectedDates'>// Omit 干掉selectedDates
interface RangeDatepickerProps extends RangeDatepickerPropsLess {
selectedDates: Array<Date | undefined> // 复写 selectedDates
}
export declare const RangeDatepicker: React.FC<RangeDatepickerProps>
本文作者:番茄炒蛋
本文地址: https://www.noway.pub/2023/09/08/NPM_interface/
版权声明:转载请注明出处!