typescript interface 覆盖

我们想对Antd的TimePicker组件进行封装,理由在于他必须接受一个moment对象,而我们的后端接口给我们的是字符串对象。

x.d.ts文件编写说明


于是,我们想要

一个接受字符串,onchange时候传回来format后的字符串这样一个组件。

因为我们这个组件的大多数属性和原来TimePicker的props是一样的,所以我们直接继承它

import type { TimePickerProps } from 'antd';
interface TimePickerPropsPlus extends TimePickerProps {
  value?: string;
  onChange?: (value: string) => void;
  format: string;
}


但是这样会遇到一个警告提示:


 参数“value”和“value” 的类型不兼容。

  •  不能将类型“Moment | null”分配给类型“string”。
  •  不能将类型“null”分配给类型“string”。

以及


 属性“onChange”的类型不兼容。

  •  不能将类型“((value: string) => void) | undefined”
  • 分配给类型“((value: Moment | null, dateString: string) => void) | undefined”。

我们无法覆盖掉原来value的类型
谷歌了下,找到了一下

有2种方案


一个是覆盖指定的单个类型:

type Omit<T, K extends keyof T> = Pick<T, Exclude<keyof T, K>>


使用方式:

interface A {
  a: number;
  b: number;
}

interface B extends Omit<A, 'a'> {
  a: boolean;
}


另外一个是批量覆盖:
 

type Merge<M, N> = Omit<M, Extract<keyof M, keyof N>> & N;


使用方式:

interface A {
    name: string;
    color?: string;
}
type B = Merge<A, {
    name: string | number;
    favorite?: boolean;
}>;

最终

我们的代码改成如下:

type Omit<T, K extends keyof T> = Pick<T, Exclude<keyof T, K>>
type Merge<M, N> = Omit<M, Extract<keyof M, keyof N>> & N;
type  TimePickerPropsPlus= Merge<
  TimePickerProps,
  {
    value?: string;
    onChange?: (value: string) => void;
    format: string;
  }
>;


参考链接:
https://qa.1r1g.com/sf/ask/2889964801/
Omit:

TypeScript项目实践之 Omit 特性 - 掘金
Extract:

[Day09] TS:什麼!型別也有分配律?理解 Extract 和 Exclude 的實作 - iT 邦幫忙::一起幫忙解決難題,拯救 IT 人的一天

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: TypeScript 接口是一种用于描述对象形状的语法结构,它可以定义对象的属性、方法、函数等,以及它们的类型和参数。接口可以用来约束函数的输入和输出,也可以用来定义类的成员。接口可以被继承和实现,从而实现代码的复用和灵活性。在 TypeScript 中,接口是一种非常重要的语言特性,它可以帮助我们更好地组织和管理代码。 ### 回答2: TypeScript中的接口(interface)是用于定义对象的结构和类型的一种语法。接口可以用来描述一个对象应该具有的属性和方法,相当于定义了一个规范。 在TypeScript中,通过interface关键字来声明一个接口。接口可以包含属性、函数、索引器和其他接口等。例如: ```typescript interface Person { name: string; age: number; sayHello(): void; } const person: Person = { name: "Alice", age: 20, sayHello() { console.log("Hello!"); } }; person.sayHello(); // 输出"Hello!" ``` 上述代码中,我们定义了一个名为Person的接口,它包含了name属性(类型为string)、age属性(类型为number)和sayHello方法(没有返回值)。然后,我们创建了一个符合Person接口规范的对象,并调用了sayHello方法。 接口的好处在于它可以提供类型检查,确保我们使用的对象符合接口的定义。如果一个对象不满足接口的要求,TypeScript会在编译时报错。这样可以在开发过程中避免一些常见的错误。 接口还可以用来描述函数类型、类类型等。它可以作为类型注解使用,对函数的输入参数和返回值进行约束,或者用于定义类的实例部分和静态部分的类型。 总而言之,TypeScript的接口是一种强大的工具,它可以帮助我们在开发过程中更好地定义和约束对象的结构和类型,提高了代码的可读性和可维护性。 ### 回答3: TypeScript中的接口(interface)是用来定义对象的结构和类型的。接口可以定义对象的属性、方法和可选属性等。 通过接口的方式可以明确定义一个对象应该具有的属性和方法,以及它们的类型。一旦定义了接口,就可以使用它来强制对象符合这个接口定义的结构。 接口的定义与类的定义有些类似,但是接口是一种抽象的概念,不能直接被实例化。它可以被类、对象、函数等来实现或者继承。当一个类实现了一个接口时,它必须实现接口中定义的所有属性和方法。 使用接口可以有效地帮助我们进行代码的重用和维护。当一个对象需要满足多个接口时,可以使用逗号将多个接口名进行分隔,在该对象中实现这些接口定义的属性和方法。 同时,接口还可以用来定义函数的参数类型和返回值类型。通过指定函数参数和返回值的接口定义,可以限制函数的使用范围,并提供更明确的类型检查。 总结起来,TypeScript中的接口是用来定义对象结构和类型的一种机制。它可以帮助我们明确对象的属性和方法,并提供类型检查。使用接口可以增加代码的可读性、可维护性,并提高代码的重用性和健壮性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陆康永

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值