Если вы переместите линию
Vue.prototype.$hi = () => alert('hi');
выше
let component = new TestComponent().$mount(wrapper)
, она будет работать. Ваш первый компонент ссылается на $hi()
до его определения.
Необходимо добавить
where T : class
к Вашему объявлению метода, например.
T Execute<T>() where T : class
{
Между прочим, как предложение, что универсальная обертка действительно не добавляет много значения. Вызывающая сторона может записать:
MyClass c = whatever.Execute() as MyClass;
Или если они хотят бросить на сбой:
MyClass c = (MyClass)whatever.Execute();
Универсальный метод обертки похож на это:
MyClass c = whatever.Execute<MyClass>();
Все три версии должны указать точно те же три объекта, только в различных заказах, таким образом, ни один не так более прост или больше удобен, и все же универсальная версия скрывает то, что происходит, тогда как "необработанные" версии, каждый проясняет, будет ли бросок или a null
.
(Это может быть не важно Вам, если Ваш пример упрощен из Вашего фактического кода).
Вы не можете использовать as
оператор с универсальным типом без ограничения. Начиная с as
оператор использует пустой указатель для представления этого, он не имел типа, Вы не можете использовать его на типах значения. Если Вы хотите использовать obj as T
, T
должен будет быть ссылочный тип.
T Execute<T>() where T : class
{
return Execute() as T;
}
Кажется, что Вы просто добавляете метод обертки для кастинга к типу, который пользователь хочет, таким образом только добавляя наверху к выполнению. Для пользователя, пишущий
int result = Execute<int>();
очень не отличается от
int result = (int)Execute();
Можно использовать модификатор, чтобы записать результат в переменную в объеме вызывающей стороны и возвратить булев флаг, чтобы сказать, успешно выполнилось ли это:
bool Execute<T>(out T result) where T : class
{
result = Execute() as T;
return result != null;
}
Существует ли шанс, которые Выполняются (), мог бы возвратить тип значения? Если так, затем Вам нужны метод Earwicker для типов классов и другой общий метод для типов значения. Мог бы быть похожим на это:
Nullable<T> ExecuteForValueType<T> where T : struct
Логика в том методе сказала бы
object rawResult = Execute();
Затем необходимо было бы получить тип rawResult и видеть, может ли он быть присвоен T:
Nullable<T> finalReturnValue = null;
Type theType = rawResult.GetType();
Type tType = typeof(T);
if(tType.IsAssignableFrom(theType))
{
finalReturnValue = tType;
}
return finalReturnValue;
Наконец, заставьте свой оригинал Выполнить фигуру сообщения, которая T, имеет (класс или тип структуры), и назовите соответствующую реализацию.
Примечание: Это от грубой памяти. Я сделал это приблизительно год назад и вероятно не помню каждую деталь. Однако, я надеюсь, указывая, что Вы в общем направлении помогаете.