首页 > 解决方案 > Typescript - 属性将自身作为参数的接口

问题描述

我有一个类型,其中一个属性是一个将该类型作为参数的类

interface Type<P extends {}> {
  name: string;
  props: P;
  field: new(type: Type<P>) => { ... };
}

// Define some Types
interface AllTypes {
  Foo: Type<{}>;
  Bar: Type<{
    foo: string;
    bar: number
  }>
}
type SomeType = AllTypes[keyof AllTypes];

我有一个函数,它需要 aSomeType并尝试实例化它field,但出现错误

function f(type: SomeType) {
  return new type.field(type);  // Error
}

更改Type.fieldnew(type: SomeType) => ...将解决此错误,但会产生更多错误:

class Field<T extends SomeType> {
  type: T;
  constructor(type: T) {
    this.type = type;
  }
}
declare class FooField extends Field<AllTypes['Foo']> {}
declare class BarField extends Field<AllTypes['Bar']> {}

const fields: SomeType[] = [
  {
    name: 'foo',
    props: {},
    field: FooField,
  },
  {
    name: 'bar',
    props: {  // This error is expected and desired
      foo: 0,
      bar: 'hi',
    },
    field: BarField,  // Error
  },
];

标签: typescript

解决方案


我认为这就是您要寻找的:

interface Type<P extends {}> {
  name: string;
  props: P;
  field: new<T extends Type<any>>(type: T) => { };
}

推荐阅读