کانال تلگرام

جاوا اسکریپت در مقابل تایپ اسکریپت (مقایسه جامع)

تاریخ : ۱۱ شهریور ۱۳۹۸
نویسنده : حمید رضا ملکی
دسته بندی ها : جاوا اسکریپت

جاوا اسکریپت و تایپ اسکریپت دو زبان شناخته شده در دنیای توسعه وب هستند، اما چه تفاوت هایی میان آنها وجود دارد و از کدام می توان استفاده بهتری داشت؟ در این مقاله به مقایسه دو زبان و چگونگی ارتباط بین آنها و تفاوت های اصلی میان آنها می پردازیم.

Javascript-vs-Typescript

تعریف تایپ اسکریپت

تایپ اسکریپت یک زبان متن باز و سوپر اسکریپت برای جاوا اسکریپت محسوب می شود که در نهایت کدهای نوشته شده با آن به زبان جاوا اسکریپت کامپایل می شوند. تایپ اسکریپت موارد مفید و کاربردی را به شما ارائه می دهد، برای مثال در تایپ اسکریپت برخلاف زبان جاوا اسکریپت نوع های داده ها ارائه شده است.

این کار می تواند از بروز خطا ها تا جای ممکن جلوگیری کند، از آنجایی که تایپ اسکریپت یک سوپر اسکریپت از جنس جاوا اسکریپت است، تمام کدهایی که در جاوا اسکریپت نوشته می شوند، در تایپ اسکریپت هم از نظر نحوی معتبر هستند. البته این موضوع بدان معنا نیست که می توان همه کدهای جاوا اسکریپت را با استفاده از کامپایلر تایپ اسکریپت پردازش کرد :

let a = 'a';
a = 1; // throws: error TS2322: Type '1' is not assignable to type 'string'.

مزایای تایپ اسکریپت

انواع داده

تایپ اسکریپت برای شناسایی دقیق ساختارهایی که منجر به خطا می شوند طراحی شده است. انواع داده ای به ما کمک می‌کند تا در زمان اجرای برنامه از اطمینان خاطر بالاتری برخوردار باشیم. اجازه دهید توابع زیر را در دو زبان جاوا اسکریپت و تایپ اسکریپت بررسی کنیم :

// Basic JavaScript
function getPassword(clearTextPassword) {
    if(clearTextPassword) {
        return 'password';
    }
    return '********';
}

let password = getPassword('false'); // "password"

هیچ چیزی در زبان جاوا اسکریپت از فراخوانی تابع مثال بالا با پارامترهای نا معتبر (یعنی غیر بولین) جلوگیری نمی کند، این مورد باعث ایجاد خطای به اصطلاح خاموش و توقف برنامه خواهد شد. اما با استفاده از زبان تایپ اسکریپت با مشخص کردن نوع داده ای پارامترها می‌توان از چنین خطاهایی کاملاً اجتناب کرد. در واقع کد شما تا زمانی که پارامتر مناسبی را با نوع مشخص شده ارائه ندهید کامپایل نخواهد شد:

// Written with TypeScript
function getPassword(clearTextPassword: boolean) : string {
    if(clearTextPassword) {
        return 'password';
    }
    return '********';
}

let password = getPassword('false'); // throws: error TS2345: Argument of type '"false"' is not assignable to parameter of type 'boolean'.

مثال بالا به وضوح نشان می‌دهد که چطور عملیات کامپایل با ارائه یک پارامتر نادرست انجام نخواهد شد. از نظر تاریخی یکی از بزرگترین عیوب زبان جاوا اسکریپت عدم رهگیری همین خطا های کوچک بوده که به لطف زبان تایپ اسکریپت این مورد کاملاً برطرف شده است. مشخص نبودن نوع های داده ای در زبان جاوا اسکریپت برای کسانی که با پیچیدگی های این زبان آشنا نیستند، می‌توانست نتایج ناخواسته ایجاد کند.

ویژگی های زبان

علاوه بر ارائه انواع داده ها در زبان تایپ اسکریپت ویژگی های زیر نیز در این زبان اضافه شده است :

  • اینترفیس ها
  • جنریک ها
  • فضاهای نام
  •  چک کردن مقادیر null
  • سطوح دسترسی

مستندات API 

فرض کنید تابع ()getPassword که در مثال های بالا ارائه کردیم متعلق به یک کتابخانه ی بیرونی باشد. چگونه می توان به عنوان مصرف کننده از چنین کتابخانه‌ ای نوع پارامتر را تشخیص داد؟ jsdoc comments هایی وجود دارد که برخی محیط ها و ویرایشگر ها همچون VSCode از آن پشتیبانی می کنند. سپس با استفاده از ابزارهایی می‌توان کامنت هایی را برای توابع نوشته شده ایجاد کرد. اما هیچ کدام از آنها تجربه لذت بخشی که تایپ اسکریپت در این مورد به شما ارائه خواهد کرد را ندارد.

fetch API را به عنوان یک مثال در نظر بگیرید، اسکرین شات زیر نشان می دهد که چطور می توانیم با استفاده از ویژگی VSCode Peek Definition توابع و یا به عبارتی API را مستند سازی کنیم. با استفاده از این ابزارها می توانیم به سرعت انواع پارامتر ورودی و نوع بازگشتی تابع را پیدا کنیم. این ابزار ها فراتر از از آن چیزی هستند که از طریق جاوا اسکریپت و  jsdocs به دست می‌آوردیم.

typescript

تصورات غلط

معمولاً در مورد انتخاب تایپ اسکریپت تصورات غلطی وجود دارد که چند مورد از آنها را در اینجا بیان می‌کنم :

  • ویژگی های ES6 یکی از شایع ترین دلایل برای انتخاب زبان تایپ اسکریپت تمایل به استفاده از ویژگی‌های ES6 مانند ماژولها، کلاس ها، توابع فلش و موارد دیگر است. با این حال همه این قابلیت ها دلیل خوبی برای انتخاب تایپ اسکریپت نیستند، زیرا با استفاده از Babel می‌توان به تمام این قابلیت ها دست پیدا کرد.
  • تایپ اسکریپت آسان تر از جاوا اسکریپت است : غالباً فکر می کنند که زبان تایپ اسکریپت در مقایسه با جاوا اسکریپت آسان تر است، مهمترین نکته ای که در این مورد وجود دارد این است که استفاده از زبان تایپ اسکریپت دلیلی بر رعایت نکردن اصول جاوا اسکریپت نیست. تایپ اسکریپت هنوز مجموعه‌ای از قواعد جاوا اسکریپت است و بسیاری از مواردی که حتی در جاوا اسکریپت نیاز به نوشتن آنها نداشتید، باید در تایپ اسکریپت رعایت شود. پس کسانی که از تایپ اسکریپت استفاده می کنند، هنوز باید بر اصول جاوا اسکریپت مسلط باشند. 

مقایسه قواعد نوشتاری و کامپایل شدن

معمولاً شنیده می شود که برنامه نویسان به دلیل ویژگی هایی مانند ماژول ها و کلاس ها از تایپ اسکریپت استفاده می کنند، با این حال باید توجه داشته باشید که این ویژگی ها از  ES6 به بعد در جاوا اسکریپت موجود هستند و می توانید برای سازگاری بیشتر مرورگر از Babel برای تبدیل به ES5 استفاده کنیم.

برای واضح شدن این موارد در این قسمت می خواهیم قواعد نوشتاری میان این دو زبان را در برخی از ویژگی های EcmaScript بررسی کنیم. برای پیاده سازی هر قابلیت از نسخه های مختلفی نشان داده شده است :

کلاس ها :

// -- TypeScript -- //
class Article {
    name: string;
    constructor(name: string) {
        this.name = name;
    }
}

// -- TypeScript compiled output -- //
var Article = /** @class */ (function () {
    function Article(name) {
        this.name = name;
    }
    return Article;
}());
// -- JavaScript with Babel -- //
class Article {
    constructor(name) {
        this.name = name;
    }
}

// -- Babel compiled output -- //
"use strict";

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

var Article = function Article(name) {
    _classCallCheck(this, Article);

    this.name = name;
};

ماژول ها 

// -- TypeScript -- //
export default class Article { }

// -- TypeScript compiled output -- //
define(["require", "exports"], function (require, exports) {
    "use strict";
    Object.defineProperty(exports, "__esModule", { value: true });
    var Article = /** @class */ (function () {
        function Article() {
        }
        return Article;
    }());
    exports.default = Article;
});
// -- JavaScript with Babel -- //
export default class Article { }

// -- Babel compiled output -- //
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

var Article = function Article() {
  _classCallCheck(this, Article);
};

exports.default = Article;

پارامتر های اختیاری

// -- TypeScript -- //
function log(message: string = null) { }

// -- TypeScript compiled output -- //
function log(message) {
    if (message === void 0) { message = null; }
}
// -- JavaScript with Babel -- //
function Log(message = null) { }

// -- Babel compiled output -- //
"use strict";

function Log() {
  var message = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;
}

کدام را باید انتخاب کرد جاوا اسکریپت یا تایپ اسکریت؟

 اگر از زبان تایپ اسکریپت استفاده می کنید از قابلیت های زیر برخوردار هستید :

  • بررسی انواع داده در زمان کامپایل انجام میشود : در جاوا اسکریپت می توانید بررسی انواع داده را در زمان اجرا انجام دهید، با این حال این کار ممکن است سر بار اضافه تری را به برنامه شما تحمیل کند.پس در اینجا تایپ اسکریپت می تواند انواع داده ای را در زمان کامپایل برای شما بررسی کند :
  • کار با کتابخانه ها و فریمورک های جدید : فرض کنید میخواهید از فریمورک ری اکت برای پروژه جدید خود استفاده کنیمد. شما با توابع و قواعد ری اکت آشنا نیستید، اما از آنجایی که تایپ اسکریپت تعریف انواع داده را ارائه می دهد، می توانید از قابلیت انتلیسنس برای کشف رابط های جدید استفاده کنید.
  •  توانایی مدیریت پروژه های بزرگ و چندین توسعه دهنده : تایپ اسکریپت به خصوص زمانی که بر روی پروژه های بزرگ کار می کنید که معمولاً چندین توسعه‌دهنده در حال کار بر روی آن هستند، بسیار مناسب است.

 اگر از زبان جاوا اسکریپت استفاده می کنید موارد زیر را در نظر بگیرید :

  • مناسب برای پروژه های کوچکتر : تایپ اسکریپت ممکن است برای انجام پروژه های کوچک مناسب نباشد پس بهتر است در این موارد از جاوا اسکریپت استفاده کنیم
  • داشتن تیمی قوی در جاوا اسکریپت : در صورتی که تیم توسعه شما به زبان جاوا اسکریپت کاملاً مسلط باشد، سوئیچ کردن به زبان تایپ اسکریپت می تواند باعث هزینه برای شما باشد پس از این موارد بهتر است از تایپ اسکریپت استفاده کنیم.
  • مواردی که فریمورک انتخابی شما از تایپ اسکریپت پشتیبانی نمی کند : اگر فریمورک انتخابی شما از تایپ اسکریپت پشتیبانی نمی کند برای مثال فریممورک EmberJS. بنابراین شما باید از جاوا اسکریپت برای توسعه کار خود استفاده کنید.
#جاوا اسکریپت #تایپ اسکریپت
۰ نظر

مقالات پیشنهادی

مشاهده همه مقالات
ثبت دیدگاه

برای ارسال دیدگاه لازم است ابتدا وارد سایت شوید