是否可以有 Select 地从另一个接口继承

请参见下面的示例

interface A { 
id: string
name: string
gender:string
address: string []
}

interface B { 
id: string
name: string
gender:string
address: number []
}
 

唯一的区别是属性address,一个是字符串[],另一个是数字[]

我能这么做吗?

interface B extend A { 
address: number []
}

推荐答案

不,您不能,您将得到一个错误:

Interface 'B' incorrectly extends interface 'A'.
  Types of property 'address' are incompatible.
    Type 'number[]' is not assignable to type 'string[]'.
      Type 'number' is not assignable to type 'string'.

但是您可以做的是使用Omit继承除address之外的所有字段

TS Playground

interface A { 
    id: string;
    name: string;
    gender: string;
    address: string[];
}

// This doesn't work
/*
interface B extends A { 
    address: number[];
}
*/

// This does
interface B2 extends Omit<A,"address"> {
    address: number[];
}

const myInstance: B2 = {
    id: "1",
    name: "Foo",
    gender: "male",
    address: [1, 2, 3]
};

另一个有效的解决方案是拥有一个通用接口.

interface X<T = number | string> { 
    id: string;
    name: string;
    gender: string;
    address: T[];
}

interface A extends X<string> { 
}

interface B extends X<number> { 
}

const instance: B = {
    id: "1",
    name: "Foo",
    gender: "male",
    address: [1, 2, 3]
};

Typescript相关问答推荐

使用Angular和API请求在CRUD操作后更新客户端数据的良好实践

如何创建泛型类型组件来使用React Native的FlatList或SectionList?'

TypeScript:在作为参数传递给另一个函数的记录中对函数的参数实现类型约束

如何使我的函数专门针对联合标记?

表单嵌套太深

如何将v-for中的迭代器编写为v-if中的字符串?

如何将别名添加到vitest配置文件?

下载量怎么会超过下载量?

正确使用相交类型的打字集

如何编辑切片器以使用CRUD调用函数?

如何正确地将元组表格输入到对象数组实用函数(如ZIP)中,避免在TypeScrip 5.2.2中合并所有值

类型脚本中参数为`T`和`t|unfined`的重载函数

为什么数字是`{[key:string]:UNKNOWN;}`的有效密钥?

内联类型断言的工作原理类似于TypeScrip中的断言函数?

如何以类型安全的方式指定键的常量列表,并从该列表派生所挑选的接口?

有没有一种方法可以防止我的组件包在其中安装样式组件'; node 模块中的s目录

通过函数传递确切的类型,但验证额外的字段

从泛型对象数组构造映射类型

对象只能使用 Typescript 中另一个对象的键

有没有办法从不同长度的元组的联合中提取带有类型的最后一个元素?