بررسی نوع - بررسی نوع کلاس در تایپاسکریپت
در ActionScript، امکان بررسی نوع در زمان اجرا با استفاده از عملگر is وجود دارد:
var mySprite:Sprite = new Sprite();
trace(mySprite is Sprite); // true
trace(mySprite is DisplayObject);// true
trace(mySprite is IEventDispatcher); // true
آیا ممکن است با TypeScript تشخیص داد که یک متغیر (که extends یا) از یک کلاس یا اینترفیس خاص است؟
من نتوانستم چیزی در مورد آن در مشخصات زبان پیدا کنم. باید وقتی با کلاسها/رابطها کار میکنید، آنجا باشد.
پاسخ شماره ۱
۴.۱۹.۴ عملگر instanceof
عملگر
instanceofنیاز دارد که عملوند سمت چپ از نوع Any، یک نوع شیء، یا یک نوع پارامتر باشد، و عملوند سمت راست از نوع Any یا یک زیرنوع از نوع رابط 'Function' باشد. نتیجه همیشه از نوع اصلی Boolean است.
پس میتوانی استفاده کنی
mySprite instanceof Sprite;
توجه داشته باشید که این عملگر همچنین در ActionScript وجود دارد اما دیگر نباید در آنجا استفاده شود:
عملگر is، که برای ActionScript 3.0 جدید است، به شما اجازه میدهد تست کنید آیا یک متغیر یا عبارت عضو یک نوع داده مشخص است یا خیر. در نسخههای قبلی ActionScript، عملگر instanceof این قابلیت را فراهم میکرد، اما در ActionScript 3.0 نباید از عملگر instanceof برای تست عضویت در نوع داده استفاده شود. به جای عملگر instanceof برای بررسی دستی نوع، باید از عملگر is استفاده شود، زیرا عبارت x instanceof y صرفاً زنجیره نمونه (prototype chain) x را برای وجود y بررسی میکند (و در ActionScript 3.0، زنجیره نمونه تصویر کاملی از سلسله مراتب ارثبری ارائه نمیدهد).
اپراتور instanceof در TypeScript همان مشکلات را دارد. از آنجایی که این زبان هنوز در حال توسعه است، توصیه میکنم پیشنهادی برای چنین قابلیتی ارائه دهید.
همچنین ببینید:
- MDN: instanceof
- مستندات TypeScript:
instanceofمحدودسازی، که نشان میدهد چگونهinstanceofمیتواند برای محدود کردن چیزها استفاده شود
پاسخ شماره ۲
تایپاسکریپت روشی برای اعتبارسنجی نوع یک متغیر در زمان اجرا دارد. شما میتوانید یک تابع اعتبارسنجی اضافه کنید که یک پیشبینی نوع بازگرداند. بنابراین میتوانید این تابع را داخل یک عبارت if فراخوانی کنید و مطمئن باشید که تمام کد داخل آن بلوک ایمن است برای استفاده به عنوان نوعی که فکر میکنید.
نمونهای از مستندات TypeScript:
function isFish(pet: Fish | Bird): pet is Fish {
return (<Fish>pet).swim !== undefined;
}
// Both calls to 'swim' and 'fly' are now okay.
if (isFish(pet)) {
pet.swim();
}
else {
pet.fly();
}
بیشتر ببینید در: https://www.typescriptlang.org/docs/handbook/advanced-types.html
پاسخ شماره ۳
شما میتوانید از عملگر instanceof برای این استفاده کنید. از MDN:
عملگر instanceof بررسی میکند که آیا ویژگی prototype یک سازنده در هر جایی از زنجیره prototype یک شی ظاهر میشود یا خیر.
اگر نمیدانید پروتوتایپها و زنجیرههای پروتوتایپ چیستند، به شدت توصیه میکنم به دنبال آن بگردید. همچنین این یک مثال در JS است (TS در این مورد مشابه عمل میکند) که ممکن است مفهوم را روشن کند:
class Animal {
name;
constructor(name) {
this.name = name;
}
}
const animal = new Animal('fluffy');
// true because Animal in on the prototype chain of animal
console.log(animal instanceof Animal); // true
// Proof that Animal is on the prototype chain
console.log(Object.getPrototypeOf(animal) === Animal.prototype); // true
// true because Object in on the prototype chain of animal
console.log(animal instanceof Object);
// Proof that Object is on the prototype chain
console.log(Object.getPrototypeOf(Animal.prototype) === Object.prototype); // true
console.log(animal instanceof Function); // false, Function not on prototype chain
زنجیره نمونه اولیه در این مثال به این صورت است:
حیوان > Animal.prototype > Object.prototype
پاسخ شماره ۴
شما دو نوع چک دارید
- نوع برای انواع پایه و
- instanceof برای نوعهای پیچیده
به عنوان مثال، بررسی isString میتواند به این صورت انجام شود:
function isString(value) {
return typeof value === 'string' || value instanceof String;
}
