2016-07-21 4 views
0

В настоящее время я использую следующий код для обработки исключений:Angular2 ExceptionHandler - проверить, если объект ошибки Ответ

@Injectable() 
export class CustomExceptionHandler extends ExceptionHandler { 
call(error, stackTrace = null, reason = null) { 
    console.warn(error); 
} 

код работает отлично, я могу увидеть ошибку в консоли. Ошибка - это объект Response, определенный в @ angle/core. Однако параметр ошибки «any». Я не могу изменить тип ошибки (например, ошибка: ответ), потому что он не обязательно будет объектом Response, это может быть что угодно.

Я хотел использовать (error instanceof Response), но это не работает, потому что ошибка - это тип объекта, что имеет смысл.

UPDATE

Так что получается (error instanceof Response) делает работу после того, как все. По какой-то причине он не работает, когда вы отлаживаете машинопись с помощью VS Code. Я поставил на него часы, и он всегда возвращался к ошибке. Может быть, это потому что я не проверять во время выполнения

Во всяком случае, важно то, что в контексте объектов Angular2 Response, instanceof будет работать нормально, как у них есть конструктор

Благодаря @DanSimon для помогая сузить то, что идет не так, и предоставить другие способы проверки типа объекта!

ответ

1

Интересный вопрос. Поскольку TypeScript действительно просто компилируется до JS, классы на самом деле не существуют. Я могу подумать о двух способах проверки, вы можете использовать «Защищенный пользователем тип» или использовать «guardof typeof type». Защищенный пользователем тип Guard - просто причудливый способ проверки свойства/функции объекта для определения его типа, преимущество заключается в том, что TS не будет жаловаться на «недостающее свойство/функцию». Использование «instanceof» работает, но только если объект имеет конструктор, поскольку он сравнивает два конструктора Object. Поэтому, если у вашего объекта нет конструктора, это не выход. Вы можете найти документацию для этих двух here.

Я также сделал plunker, демонстрируя, как они работают. Результаты будут загружаться в консоль, поэтому используйте инструмент debug для браузеров, чтобы увидеть результаты. Вся работа выполняется над «app/child.component.ts» в функции «ngOnChanges».

ngOnChanges(changes: {[propertyName: string]: SimpleChange}) { 
    console.log(); 
    console.log("Custom function isSimpleChange:", this.isSimpleChange(changes)); 
    console.log("Using instanceof SimpleChange:", (changes instanceof SimpleChange)); 
    console.log("Using Object.prototype.toString.call():", Object.prototype.toString.call(changes)); 
    console.log("Logging the object itself:",changes); 
    console.log("-----------------------------------------------------------------------------------------"); 
    let testExample = new ExampleObject(); 
    console.log("Custom function isExampleObject:", this.isExampleObject(testExample)); 
    console.log("Using instanceof ExampleObject:", (testExample instanceof ExampleObject)); 
    console.log("Using Object.prototype.toString.call():" + Object.prototype.toString.call(testExample)); 
    console.log(testExample); 


    this._result = changes.value.currentValue; 
    this._changes++; 
} 

Вы, вероятно, нужно использовать обе, а также «TypeOf» для примитивных типов, чтобы сделать полный осмотр объекта. Таким образом, используя «typeof» для проверки базовых типов «строка», «число», «булево». Затем, используя «instanceof», чтобы увидеть, соответствуют ли конструкторы, наконец, используя «User-Defined Type Guard» для поиска конкретных «свойств/функций».

Смежные вопросы