对以下声明感到困惑:
constructor(controls: {[key: string]: AbstractControl}, optionals?: {[key: string]: boolean}, validator?: ValidatorFn, asyncValidator?: AsyncValidatorFn)
控件的类型(第一个参数)是什么? 它是一个对象,它是一个键值对数组,其中键是字符串,值是AbstractControl?谢谢!
答案 0 :(得分:41)
是的,就像你猜测的那样,它是一个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>;
答案 1 :(得分:0)
除了上述答案,您还可以在这种情况下使用 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>;