проблема с определением типа. не удается избавиться от типа any

#javascript #typescript #types #casting

#javascript #typescript #типы #Кастинг

Вопрос:

Мне нужно загрузить некоторые виджеты из объекта шаблона (возможно, json позже). вот пример:

 type RectangleTemplate = {
  name: 'Rectangle';
  props: {
    width: number;
    height: number;
  }
};

type ButtonTemplate = {
  name: 'Button';
  props: {
    text: string;
  }
};

type Template = ButtonTemplate | RectangleTemplate;

class Button {
  constructor(template: ButtonTemplate) {
    console.log(template.name);
  }
}

class Rectangle {
  constructor(template: RectangleTemplate) {
    console.log(template.name);
  }
}

const widgets = { Button, Rectangle }

const createWidget = (template: Template): void => {
  const ctor = widgets[template.name as keyof typeof widgets];
  const node = new ctor(template as any);
};

const template: Template = {
  name: 'Button',
  props: {
    text: 'button'
  }
}

const widget = createWidget(template);

 

Проблема в этой строке : const node = new ctor(template as any); . Я не могу передать аргумент, подобный template: Template конструктору, и принудительно привести его как любой. не могу понять, как это сделать правильно.
ссылка на игровую площадку ts

Ответ №1:

Во-первых, учитывая, что вы должны знать типы shape , вы можете добавить их к ShapeNames типу.

 type ShapeNames = 'Rectangle' | 'Button'; // append the rest of the possible shapes
 

Во-вторых, создайте тип TemplateProps для каждой фигуры и добавьте их к родительскому типу ShapeTemplateProps .

 
type RectangleTemplateProps = {
  width: number;
  height: number;
}

type ButtonTemplateProps = {
  text: string;
}

// Append additional templateProps type below
type ShapeTemplateProps = RectangleTemplateProps | ButtonTemplateProps;
 

Затем назначьте ShapeTemplateProps тип props .

 type RectangleTemplate = {
  name: ShapeNames;
  props: ShapeTemplateProps;
};

type ButtonTemplate = {
  name: ShapeNames;
  props: ShapeTemplateProps;
};

 

Наконец, удалите as any приведение типов.

Комментарии:

1. да, имя соответствует определенному набору реквизитов.

2. такое простое решение. Спасибо! ты лучший!