键值对声明的打字稿数组

Typescript array of key value pairs declaration

对以下声明感到困惑:

constructor(controls: {[key: string]: AbstractControl}, optionals?: {[key: string]: boolean}, validator?: ValidatorFn, asyncValidator?: AsyncValidatorFn)

控件的类型(第一个参数)是什么? 它是一个对象,它是一个键值对数组,其中键是字符串,值是 AbstractControl?谢谢!

是的,就像你猜的那样,它是一个 js 对象,键为字符串,AbstractControl 为值。
例如:

{
    "control1": new Control(),
    "control2": new Control()
}

编辑

您可以通过两种方式将变量声明为这种类型:

let controls: { [key: string]: AbstractControl };

interface ControlsMap {
    [key: string]: AbstractControl;
}

let controls: ControlsMap;

甚至更好:

interface ControlsMap<T extends AbstractControl> {
    [key: string]: T;
}

let controls1: ControlsMap<AbstractControl>;
let controls2: ControlsMap<MyControl>;

除了上述答案,您还可以使用 Record<Keys,Type> utility type 来解决这种情况。

type ControlsMap = Record<string, AbstractControl>;

const mapping: ControlsMap = {
  keyA: new Control(),
  keyB: new Control(),
};

或使用泛型:

type ControlsMap<T extends AbstractControl> = Record<string, T>;