انگولار - علامت تعجب در تعریف نوع
در حال حاضر من به دکوراتور ContentChildren در Angular برخورد کردم. در اولین مثال کد از نحو زیر استفاده شده است:
import {AfterContentInit, ContentChildren, Directive, QueryList} from '@angular/core';
@Directive({selector: 'child-directive'})
class ChildDirective {
}
@Directive({selector: 'someDir'})
class SomeDir implements AfterContentInit {
@ContentChildren(ChildDirective) contentChildren !: QueryList<ChildDirective>; // this line is relevant
ngAfterContentInit() {
// contentChildren is set
}
}
به علامت تعجب به دنبال دو نقطه درست بعد از تعریف متغیر @ContentChildren(ChildDirective) contentChildren توجه کنید. در این بحث در StackOverflow متوجه شدم که میتوان از این سینتکس به عنوان «عملگر تأیید غیر تهی» هنگام دسترسی به یک متغیر یا ویژگی شیء استفاده کرد.
سؤالم اکنون این است که آیا علامت تعجب قبل از تعریف یک نوع دقیقاً همان معنایی را دارد که در یک زمینهٔ معمولی دارد. آیا این به سادگی به کامپایلر TypeScript میگوید: «باشه، نگران null یا undefined نباش»، یا این نحو در این زمینه معنی خاص دیگری دارد؟
پاسخ شماره ۱
سوالم اکنون این است که آیا علامت تعجب قبل از تعریف نوع دقیقاً همان معنایی را دارد که در یک زمینه عادی دارد.
نه، در واقع این همان چیز نیست، در این زمینه کار متفاوتی انجام میدهد. معمولاً وقتی یک عضو را اعلام میکنید (که نوع آن شامل undefined نمیشود) باید مستقیماً یا در سازنده مقداردهی اولیه شود. اگر ! را بعد از نام اضافه کنید، TypeScript این را نادیده میگیرد و اگر فوراً مقداردهی اولیه نکنید خطایی نشان نمیدهد:
class Foo {
foo: string; // error: Property 'foo' has no initializer and is not definitely assigned in the constructor.
bar!: string; // no error
}
همین موضوع در واقع برای متغیرهای محلی نیز صدق میکند:
let foo: string;
let bar!: string;
console.log(foo); // error: Variable 'foo' is used before being assigned.
console.log(bar); // no error
زمین بازی
