typescript - 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.field
为new(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
},
];
解决方案
我认为这就是您要寻找的:
interface Type<P extends {}> {
name: string;
props: P;
field: new<T extends Type<any>>(type: T) => { };
}