الف) package manager console را باز کنید و سپس دستور tsc -v را صادر کنید.
ب) فایل پروژه (csproj) را باز کرده و مدخل TypeScriptToolsVersion آنرا بررسی کنید. این شماره نگارش مقدم است بر عددی که با tsc -v مشاهده میکنید.
A 2016 study found that the economic impact of Daylight Saving , due to increased heart attacks, workplace accidents and cyberloafing (slacking off at work!) cost the US economy $434 million each year, there are a great many others that present similar evidence.
In 2019 the European Union voted to abolish daylight saving in 2021, similarly the “Sunshine Protection Act of 2021” is gaining traction in the US. Over the next decade I feel quite sure that most of the globe will reject daylight saving entirely.
Here's a couple of final thoughts.
let name: string; name = "Vahid"; // OK name = null; // OK name = undefined; // OK
let age: number; age = 24; // OK age = null; // OK age = undefined; // OK
{ "compilerOptions": { "strictNullChecks": true } }
let foo: string = null; // Error! Type 'null' is not assignable to type 'string'.
Uncaught ReferenceError: foo is not defined Uncaught TypeError: window.foo is not a function
// With strictNullChecks set to false let d: Array<number> = [null, undefined, 10, 15]; //OK let e: Array<string> = ["pie", null, ""]; //OK // With strictNullChecks set to true let d: Array<number> = [null, undefined, 10, 15]; // Error let e: Array<string> = ["pie", null, ""]; // Error
{ "compilerOptions": { "strict": true /* Enable all strict type-checking options. */ } }
{ "compilerOptions": { "strict": true, "noImplicitThis": false } }
let foo: string | null = null; // Okay!
let name: string | null; name = "Vahid"; // OK name = null; // OK name = undefined; // Error
let z = null;
testAssignedBeforeUseChecking() { let x: number; console.log(x); }
[ts] Variable 'x' is used before being assigned.
let z: number | undefined; console.log(z);
method1(x?: number) { }
method1(x?: number | undefined) { }
f(x: number): string { return x.toString(); } testTypeGuards() { let x: number | null | undefined; if (x) { this.f(x); // Ok, type of x is number here } else { this.f(x); // Error, type of x is number? here } }
Argument of type 'number | null | undefined' is not assignable to parameter of type 'number'. Type 'undefined' is not assignable to type 'number'.
getLength(s: string | null) { return s ? s.length : 0; }
isNumber(n: any): n is number { // type guard return typeof n === "number"; }
usedMb(usedBytes?: number): number | undefined { return this.isNumber(usedBytes) ? (usedBytes / (1024 * 1024)) : undefined; }
usedMb2(usedBytes?: number): number | undefined { return usedBytes ? (usedBytes / (1024 * 1024)) : undefined; }
formatUsedMb(): string { //ERROR: TS2531: Object is possibly undefined return this.usedMb(123).toFixed(0).toString(); }
formatUsed(): string { const usedMb = this.usedMb(123); return usedMb ? usedMb.toFixed(0).toString() : ""; }
export interface User { name: string; age?: number; }
printUserInfo(user: User) { if (user.age != null) { console.log(`${user.name}, ${user.age.toString()}`); } }
printUserInfo(user: User) { console.log(`${user.name}, ${user.age.toString()}`); }
printUserInfo(user: User) { console.log(`${user.name}, ${user.age!.toString()}`); }
[tslint] Forbidden non null assertion (no-non-null-assertion)
نام پروژهی من AMD و فایل index.html بدان اضافه شده است. فرض کنید یک پوشهی جدید را به نام modules به آن اضافه میکنیم و در آن دو فایل typescript ی را به نامهای module1.ts و module2.ts، اضافه میکنیم.
محتویات module1 را اینگونه مینویسیم:
export module module1 { export abstract class firstCls { static f1(str: string) { console.log(str); } } }
و همچنین module2 به شکل زیر خواهد بود:
import * as Amd from 'module1'; module module2 { export class secondCls { f2(str: string) { Amd.module1.firstCls.f1(str); } } } new module2.secondCls().f2(`amd work's`);
(دقت کنید بعد از کامپایل شدن لفظ import تبدیل به define میشود)
از طریق add - new item فایل tsconfig.json را به مسیر اصلی پروژه اضافه کنید. در صورتی که آن را پیدا نکردید، به صورت دستی فایل آن را ساخته و محتویات زیر را در آن کپی نمایید:
{ "compilerOptions": { "noImplicitAny": false, "noEmitOnError": true, "removeComments": false, "sourceMap": false, "target": "es6", "module": "amd" }, "exclude": [ "node_modules" ] }
در ادامه به root پروژه رفته و دستور npm init را ارسال کرده تا فایل package.json تولید شود. همچنین برای requirejs نیز دستور زیر را ارسال مینماییم:
npm install requirejs --save-dev
حال requirejs به پروژهی شما اضافه شده است.
برای مدیریت کردن فراخوانی initial module در پوشهی modules که قبلا ساخته بودیم فایل main.js راساخته و کدهای زیر را بدان اضافه مینماییم.
(لازم به ذکر است این فایل را میتوانیم با استفاده از typescript نوشته و requirejs definitely typed را به پروژه اضافه کرده و از مزایای intellisense بودن بهره ببریم)
کدهای زیر را درون main.js مینویسیم:
require(['modules/module2.js'], modules_module2()); function modules_module2() { //additionals config goes here }
از آنجاییکه ممکن است تعداد وابستگی فایلها زیاد باشد و ترتیب load شدن آنها نیز اهمیت داشته باشد، در این قسمت میتوان configهای بیشتری را همچون sequence در load کردن فایلها، تعریف کرد که میتوانید در وبسایت رسمی requirejs آن را مطالعه بفرمایید.
حال فایل index.html را باز کرده و config برای فراخوانی requirejs, main.js را مینویسیم؛ به صورت زیر:
<h1>Hello requirejs and amd modules</h1> <!--src means require js address--> <!--data-main means initial require config--> <script src="node_modules/requirejs/require.js" data-main="modules/main.js"></script> <script></script>
پر واضح است که src آدرس فایل require.js و همچنین data-main آدرس initial require config پروژه را مشخص میکند.
اکنون پروژه را run کرده و میبینید که فایلهای مورد نیاز به صورت async برای ما load میشوند. اگر از مرورگر کروم استفاده مینمایید، بدین صورت میتوانید network و همچنین console را مشاهد نمایید:
مشاهد میکنید که فایلهای مورد نیاز load شدهاند و همچنین amd work's در console نمایش داده شده است.
requirejs بدین صورت عمل میکند: بعد از یافتن هر فایل، با استفاده از regex کل فایل را بررسی کرده و به دنبال وابستگیهای آن فایل میگردد (منظور همان importها میباشد و آن فایل به صورت async لود میشود) و در فایلهای بعدی نیز همین روال ادامه خواهد یافت. هر چند راهکارهایی برای بهبود کارآیی در آن اندیشیده شده است؛ بدین صورت که اساس کارش با استفاده از singleton میباشد و بعد از require کردن فایلی، هر دفعه که فراخوانی میشود، نیاز به پردازش مجدد ندارد. با این وجود ممکن است در بعضی مواقع و مخصوصا با اشتباهات سهوی برنامه نویسان از کارآیی نرم افزار مطبوع شما بکاهد.
کدهای این برنامه را میتوانید از اینجا دریافت نمایید (ضمن اینکه وابستگیهای اضافهتری مانند پوشهی node_modules حذف شدهاند؛ بنابراین npm install فراموش نشود)
دانلود AMD.zip
در قسمت بعد به امکانات توکار کامپایلر typescript برای معماری ماژولها میپردازیم
- .NET Core
- Node.js
- Docker
- Elasticsearch: A distributed and open source search engine based on Lucene. A blazing fast NoSQL database with replication capabilities, it is the most widely known component of the ELK stack, together with Kibana (for reporting and visualizations), Logstash (for data import) and Beats (for data shipping). Even Azure Search uses it behind the covers. Free but some tools are paid. Get it from http://elastic.co.
- ECMAScript 2015
- HTML5
- Kafka
- TypeScript
- MongoDB
- Git
- Nginx
- Octopus Deploy
- Azure
- Amazon Web Services
- Linux
- Visual Studio Code
- Xamarin
- Google Analytics
- SQL Server 2016
- Let’s Encrypt
- TensorFlow
- GitLab
- Redis