#angular #typescript #undefined
#angular #typescript #не определено
Вопрос:
В моем приложении есть такой компонент:
@Component({
selector: 'app-payment-intent',
templateUrl: './payment-intent.component.html',
styleUrls: ['./payment-intent.component.css']
})
export class PaymentIntentComponent implements OnInit {
static = false;
@ViewChild(StripeCardComponent, this.static) card: StripeCardComponent;
Но когда я пытаюсь скомпилировать приложение, я получаю
Object is possibly 'undefined'
Ошибка заключается в переменной static = false
, которая @ViewChild(StripeCardComponent, this.static) card
вызывает получение переменной, насколько это возможно undefined
, но, как вы можете видеть, переменная не undefined
является переменной, переменная является логическим инициализированным false
..
Что я могу сделать, чтобы решить эту проблему?
Спасибо!
Комментарии:
1. Вы можете попробовать определить его как
static: boolean = false;
. Но проблема может заключаться в том, что этоstatic
зарезервированное слово, поэтому вы можете переименовать свою переменную.
Ответ №1:
@ViewChild , в данном случае, является декоратором. Чтобы понять проблему, вам нужно понять, как работают декораторы и как они применяются к методам.
Исходный код:
function decorator(value?:any) {
return function <T>(target: unknown, propertyKey: string, descriptor: TypedPropertyDescriptor<T>): void {
console.log('value:', value);
};
}
class Bar {
@decorator(this)
public foo():void {}
}
Скомпилированный код:
// __decorate and __metadata declarations skipped
function decorator(value) {
return function (target, propertyKey, descriptor) {
console.log('value:', value);
};
}
class Bar {
foo() { }
}
__decorate([
decorator(this),
__metadata("design:type", Function),
__metadata("design:paramtypes", []),
__metadata("design:returntype", void 0)
], Bar.prototype, "foo", null);
После компиляции этого кода вы можете видеть, что декораторы изменяют класс прототипа, а не его экземпляр. Таким образом, «this» в аргументе «this.static», который вы передаете декоратору, указывает на отсутствие контекста, и поэтому его значение не определено.
Комментарии:
1. Очень хорошо объяснено. Я думаю, что это объяснение должно быть предоставлено TypeScript в документации или кратко изложено непосредственно в сообщении об ошибке.
Ответ №2:
Вы можете обратиться к миграции статических запросов Angular, где показано, что @ViewChild
2-й параметр — { static: boolean }
type, поэтому вам следует отредактировать свой на:
@ViewChild(StripeCardComponent, { static: this.static }) card: StripeCardComponent;
или гораздо лучше назначить его напрямую, поскольку это условие будет применяться при инициализации:
@ViewChild(StripeCardComponent, { static: false }) card: StripeCardComponent;