2015-10-24 1 views
1

У меня есть этот код, который работает:Как добавить свойство во время выполнения в машинописном

if ((<any>this.router).userIntendedRedirectRoute) { 
     this.router.navigate((<any>this.router).userIntendedRedirectRoute); 
    } else { 
     this.router.navigateBack(); 
    } 

В основном, в ранее кода, я добавляю свойство к маршрутизатору, а затем присвоить ему значение.

Затем я получаю это значение.

Это работает, но кажется, что оно должно быть отлито для нескольких раз.

Проблема, которую я пытаюсь решить, заключается в том, что маршрутизатор поступает из фреймворка, и я не могу напрямую изменить исходный код.

ответ

3

Вы можете получить значение свойства с помощью квадратных скобок и имя свойства:

this.router["userIntendedRedirectRoute"] 
+1

Мне очень нравится этот ответ. Использование квадратных скобок ясно показывает, что это динамическое свойство. Другими словами, разработчик отказывается от проверки типов для этого свойства. Обратите внимание, однако, что это порождает новую проблему в том, что компилятор помещает ее как ошибку «Implicity any». К счастью, команда TS создала флаг 'suppressImplicitAnyIndexErrors', который позволяет использовать это без возникновения ошибки. –

+0

+1 FWIW 'Использование квадратных скобок ясно показывает, что это динамическое свойство' является известной и поддерживаемой концепцией – basarat

+0

Это отлично работает с JSON Web Tokens, которые созданы на сервере, поэтому многие свойства создаются во время выполнения! Большое спасибо ! – skiabox

0

Вместо использования any, вы должны определить, что маршрутизатор.

interface MyRouter { 
    userIntendedRedirectRoute?: string; 
    navigate(route: string); 
    navigateBack(); 
} 

if((<MyRouter>this.router).userIntendedRedirectRoute) { 
    (<MyRouter>this.router).navigate((<MyRouter>this.router).userIntendedRedirectRoute); 
} else { 
    (<MyRouter>this.router).navigateBack(); 
} 

Вы также можете бросить его на переменную:

var myRouter: MyRouter = this.router; 

if(myRouter.userIntendedRedirectRoute) { 
    myRouter.navigate(myRouter.userIntendedRedirectRoute); 
} else { 
    myRouter.navigateBack(); 
} 
Смежные вопросы