Воспользуйтесь преимуществом того факта, что транспортер машинописи может указать вам, где в вашем коде есть опечатка. Например:
let body: {count: number, next: string, journals: Journal[]} = {"count": res["count"], "next": res["next"], "journals": []};
this.journalFactory.create(journalInfo, body.journals);
// ^^^ Please notice typo here
Почти каждый IDE и процесс переноса будут выдавать ошибку, когда вы дадите информацию о типе для машинописного текста.
Просто выведите IControl
из IControl
.
public interface IControl<T> : IControl
{
T Value { get; }
}
ОБНОВЛЕНИЕ
Если я вас неправильно понял, а вы не хотите не универсальный интерфейс, вы должны будете также сделать метод GetControl ()
универсальным.
public IControl<T> GetControl<T>()
{
if (typeof(T) == typeof(Boolean))
{
return new BoolControl(); // Will not compile.
}
else if (typeof(T) == typeof(String))
{
return new StringControl(); // Will not compile.
}
else
{
return null;
}
}
Теперь у вас есть проблема, что новые элементы управления не могут быть неявно преобразованы в IControl
, и вам придется сделать это явным.
public IControl<T> GetControl<T>()
{
if (typeof(T) == typeof(Boolean))
{
return new (IControl<T>)BoolControl();
}
else if (typeof(T) == typeof(String))
{
return (IControl<T>)new StringControl();
}
else
{
return null;
}
}
ОБНОВЛЕНИЕ
Изменено приведение с как IControl
на (IControl
. Это предпочтительнее, потому что это вызовет исключение, если есть ошибка, в то время как , поскольку IControl
молча возвращает ноль
.
public IControl<T> GetControl<T>()
{
switch (typeof(T).Name)
{
case "Bool":
return (IControl<T>) new BoolControl();
case "String":
return (IControl<T>) new StringControl();
}
return null;
}
Обновление; исправил пару ошибок в коде. Вот вызов, чтобы получить класс:
IControl<bool> boolControl = GetControl<bool>();
Тип возвращаемого значения должен быть универсальным, поскольку, ну, это так. Подумайте, как бы вы использовали это. Возврат строго типизированного объекта устраняет необходимость в универсальном фабричном методе.
Даже если бы вы могли это сделать, в чем заключается выигрыш в
IControl<bool> boolControl = controlFactory.GetControl("bool");
или тот, который будет работать,
IControl<bool> boolControl = controlFactory.GetControl<bool>("bool");
над определенным
IControl<bool> boolControl = controlFactory.GetBoolControl("bool");
В любом случае , у вас есть переключатель () на стороне клиента. Либо верните объект, либо используйте нетипизированный интерфейс IControl.