打字稿可扩展泛型类型/接口

时间:2021-01-20 04:26:30

标签: typescript generics

所以我想制作某种基本接口/类型,可以根据它拥有的通用对象扩展属性。

有点像这样:

interface BaseObject<Extension extends object = {}>{
   a: string;
   b: string;
   {...Extension} <<< this is something i know works in object but not here
} 

const sample:BaseObject<{x: number}> = {
    a: '123',
    b: '123',
    x: 123 <<<< forcing type check
}

如何做到这一点?

2 个答案:

答案 0 :(得分:0)

您可以通过扩展接口本身来实现这一点。

interface LessBaseObject extends BaseObject {
  x: number;
}

const sample: LessBaseObject = {
  a: '123',
  b: '123',
  x: 123,
};

答案 1 :(得分:0)

实现此目的的另一种方法是通过 Extension 上的映射类型。无论出于何种原因,TypeScript 都不允许您声明使用映射类型的类型声明属性类型或在 interace 声明中使用映射类型,但是您可以创建一个类型,即Extension 和基本属性的交集来实现这一点,虽然语法有点时髦:

type BaseObject<
  Extension extends object = {},
  All = Extension & { a: string; b: string }
> = {
  [K in keyof All]: All[K];
};

请注意,使用第二个通用属性并不是绝对必要的。你也可以这样写:

type BaseObject<Extension extends object = {}> = {
  [K in keyof (Extension & { a: string; b: string })]: (Extension & {
    a: string;
    b: string;
  })[K];
};