<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          為什么選擇使用 TypeScript ?

          共 22908字,需瀏覽 46分鐘

           ·

          2021-04-01 12:47

          2020 年最有前途的五種語言,TypeScript 已經(jīng)成為其中之一。大約 60% 的前端程序員正在使用或曾使用過 TypeScript,而另外 22% 的開發(fā)者希望嘗試使用。那么什么是 TypeScript?


          TypeScript 和 JavaScript 語法沒有明顯的區(qū)別,意味著你無需學(xué)習(xí)很多知識(shí)就可以開始無縫編寫 TypeScript 代碼。簡而言之,TypeScript 是 JavaScript 的超集。


          所以你準(zhǔn)備好了嗎?如果沒有,那么接下來這篇文章幫你。感興趣的同學(xué)可以結(jié)合來自 Leslie/Jare 的官方系列教程 Cocos Creator 3.0 TypeScript 使用答疑一起食用~


          本文由“壹伴編輯器”提供技術(shù)支

          前言

          相信經(jīng)常關(guān)注前端技術(shù)的同學(xué)對(duì) TypeScript 應(yīng)該不陌生,或多或少看過一些關(guān)于 TypeScript 的文章。
          各種技術(shù)論壇上也有不少關(guān)于 TypeScript 和 JavaScript 的討論,大多數(shù)人對(duì) TypeScript 都有著不錯(cuò)評(píng)價(jià),但也有不少人覺得它沒有存在的必要。

          事實(shí)上,TypeScript 作為前端編程語言界的當(dāng)紅炸子雞,配合代碼編輯器界的當(dāng)紅炸子雞 VS Code 能夠讓人擁有極佳的編碼體驗(yàn)。
          許多過去一直使用 JavaScript 的同學(xué),在使用 TypeScript 之后,都覺得再也回不去了。
          微軟的這一套組合拳,打得多少人大喊真香!(真香定律雖遲但到 

          它不是好不好用的問題,它真的是那種,那種很少見的那種......

          魯迅先生曾說過:人生苦短,我用 TS 。


          作為假前端的我,使用 TypeScript 進(jìn)行開發(fā)也有一年半的時(shí)間了,也希望和各位分享一下我的看法。
          所以在本篇文章我將以一名 Cocos Creator 開發(fā)者的角度,來對(duì) TypeScript 做一波客觀分析(強(qiáng)行安利),希望對(duì)各位有所幫助。

          本文由“壹伴編輯器”提供技術(shù)支

          大綱

          1. 什么是 TypeScript
          2. TypeScript 存在的意義
          3. TypeScript 帶來了什么改變
          4. TypeScript 有什么特點(diǎn)
          5. 如何創(chuàng)建 Creator TS 項(xiàng)目
          6. 原有的 JS 項(xiàng)目如何使用 TS


          本文由“壹伴編輯器”提供技術(shù)支

          正文

          什么是 TypeScript 


          TypeScript 是一種微軟開發(fā)并開源的跨平臺(tái)編程語言,最初開發(fā) TypeScript 的目的是為了更好地開發(fā)大型項(xiàng)目,作者為大名鼎鼎的 C# 之父 Anders Hejlsberg 。

          在 TypeScript 中文主頁中對(duì)于 TypeScript 的定義是“JavaScript 的超集”, TypeScript 支持JavaScript 的所有語法語義最新的 ECMAScript 特性,并且額外添加了很多特性。

          通過 TypeScript 編譯器(tsc),TypeScript 代碼可以被編譯成純凈、簡潔的 JavaScript 代碼

          主頁中對(duì) TypeScript 的介紹:

          TypeScript 存在的意義


          TypeScript 雖為大型項(xiàng)目而生,但是不代表它不適用于中小型項(xiàng)目,只是項(xiàng)目越大收益越明顯。

          TypeScript 彌補(bǔ)了 JavaScript 的許多不足,同時(shí)保留了 JavaScript 的靈活性,大大提高了項(xiàng)目的開發(fā)效率以及可維護(hù)性。

          TypeScript 的誕生不是為了取代 JavaScript ,而是讓 JavaScript 變得更好。

          所以 TypeScript 對(duì)于開發(fā)者來說,不僅僅是一門編程語言,更是生產(chǎn)力工具。


          TypeScript 的良好口碑以及日漸龐大的生態(tài),早就已經(jīng)證明了它自己。
          許多優(yōu)秀的開源項(xiàng)目例如前端三大框架 Angular、React 和 Vue 均已支持 TypeScript ,Angular2 和 Vue 3.0 都是直接用 TypeScript 開發(fā)的!
          大多數(shù)第三方 JavaScript 庫都提供了對(duì) TypeScript 的支持
          并且 Node.js 作者近期正式發(fā)布Deno 1.0 也是原生支持 TypeScript 。
          (可以看到 TypeScript 的未來一片光明...)

          你幾乎天天用來寫代碼的 VS Code 也是用 TypeScript 編寫的。(用記事本寫代碼的大佬請(qǐng)先收起你的菜刀 ) 


          而對(duì)于 Creator 開發(fā)者來說最最最重要的是:
          Cocos Creator 引擎開發(fā)團(tuán)隊(duì)也建議開發(fā)者使用 TypeScript 進(jìn)行開發(fā)。
          目前 Creator 3D 只支持使用 TypeScript 進(jìn)行開發(fā)。
          我可以大膽的說未來 TypeScript 將會(huì)成為 Cocos Creator 開發(fā)的標(biāo)配!

          TypeScript 帶來了什么改變


          既然 TypeScript 為大型項(xiàng)目而生,那不如就讓我們看看 TypeScript 為什么適合大型項(xiàng)目?

          在項(xiàng)目的開發(fā)中,必定少不了眾多的開發(fā)人員,在這個(gè)模塊化的時(shí)代,一個(gè)項(xiàng)目的多個(gè)模塊可能均由不同的人來開發(fā),并且每個(gè)人都有不同的編碼習(xí)慣。

          在使用 JavaScript 進(jìn)行開發(fā)時(shí),由于沒有類型限制、自動(dòng)補(bǔ)全智能提示,就需要開發(fā)人員之間的頻繁溝通或者頻繁閱讀文檔(詳細(xì)的文檔很關(guān)鍵)保證代碼可以正確執(zhí)行。
          即便如此,開發(fā)人員也不能保證每個(gè)變量/函數(shù)名都一次寫對(duì),每個(gè)參數(shù)都一次傳對(duì)。
          這些溝通和翻閱文檔所花費(fèi)的時(shí)間都在默默降低項(xiàng)目整體開發(fā)效率。

          而使用 TypeScript 進(jìn)行開發(fā)時(shí),得益于類型系統(tǒng),在讀取變量或調(diào)用函數(shù)時(shí),均有自動(dòng)補(bǔ)全,基本杜絕寫錯(cuò)變量/函數(shù)名的情況。
          類型限制智能提示讓開發(fā)人員調(diào)用 API 時(shí)可以快速得知參數(shù)要求,不需要再頻繁閱讀代碼、文檔或詢問模塊開發(fā)者。
          所有變量、函數(shù)和類都可以快速溯源(跳轉(zhuǎn)到定義),讓 TypeScript 代碼有著較好的可維護(hù)性。合理利用注釋甚至可以完全不看文檔,真正做到“注釋即文檔”。(文檔還是要有的 
          總之就是開發(fā)效率 MAX !

          TypeScript 的特點(diǎn)


          • 類型系統(tǒng)
          眾所周知 JS 是一門弱類型語言,不到執(zhí)行時(shí)都不能確定變量的類型。編碼時(shí)可以隨心所欲反正不報(bào)錯(cuò),一不小心就寫出八哥( undefined 警告!)。

          1. 靜態(tài)類型檢查讓 TS 在編輯器中披上強(qiáng)類型語言的“馬甲”,使得開發(fā)者在編碼時(shí)就可以避免大多數(shù)類型錯(cuò)誤的情況發(fā)生,而開發(fā)者要做的就只是聲明變量時(shí)多寫一個(gè)符號(hào)和一個(gè)單詞。(當(dāng)然你也可以在聲明變量時(shí)不指定類型或者使用 any 類型來達(dá)到 JS 的動(dòng)態(tài)類型效果,讓 TypeScript 變成 AnyScript ,任性~ 
          let name: string = '陳皮皮';
          name = 9527; // 報(bào)錯(cuò)

          let age: any = 18;
          age = 'eighteen'; // 不報(bào)錯(cuò)

          真正做到早發(fā)現(xiàn),早解決早下班 

          2. TS 在支持與 JS 幾乎相同的原始類型之外,還額外提供了枚舉(Enum)和元組(Tuple)的支持。(小聲BB:再也不需要 cc.Enum 了)
          // 枚舉
          enum 
          Direction {
              Up = 1,
              Down,
              Left,
              Right
          }
          let direction:
          Direction = Direction.Up;

          // 元組
          let x: [string, number];
          x = ['hello', 10]; // 不報(bào)錯(cuò)
          x = [10, 'hello']; // 報(bào)錯(cuò)

          ★ 另外類型系統(tǒng)配合聲明文件(關(guān)于聲明文件我們后面再聊)給我們帶來了編輯器中完善的自動(dòng)補(bǔ)全智能提示,大大增加了開發(fā)效率,也再不會(huì)因?yàn)槠村e(cuò)變量名或函數(shù)名而導(dǎo)致運(yùn)行時(shí)的錯(cuò)誤。(我知道 JS 加插件也能實(shí)現(xiàn)一定程度的智能提示但是語言自帶它不香嗎?)


          • 修飾符和靜態(tài)關(guān)鍵字
          淚目,是從 C# 那里幾乎原汁原味搬過來的一套修飾符和關(guān)鍵字,主要如以下幾個(gè):

          1. 訪問修飾符public private protected
          用來限定類成員的可訪問范圍。
          個(gè)人覺得沒有訪問修飾符的封裝莫得靈魂的!
          class Me {
              public name = '陳皮皮'; // 大家都知道我叫陳皮皮
              private secret = '*******'; // 我的秘密只有我知道
              protected password = '********'; // 我的支付寶密碼會(huì)告訴我的后人的
          }

          let me = new Me();
          let a = me.name; // 拿到了我的名字
          let b = me.secret; // 報(bào)錯(cuò),私有的屬性
          let c = me.password; // 報(bào)錯(cuò),受保護(hù)的屬性

          class Child extends Me {
              constructor() {
                  super();
                  this.name = '陳XX';
                  this.secret // 報(bào)錯(cuò),無法訪問
                  this.password = '888888'; // 可以訪問
              }
          }

          2. 靜態(tài)關(guān)鍵字static
          用于定義全局唯一的靜態(tài)變量和靜態(tài)函數(shù)。
          在 Creator 的 JS 腳本中是用 cc.Class 的 static 屬性來定義靜態(tài)成員的個(gè)人覺得使用體驗(yàn)極差)。
          class Whatever {
              public static origin: string = 'Whatever';
              public static printOrigin() {
                  console.log(this.origin);
                  console.log(Whatever.origin);
              };
          }

          console.log(Whatever.origin); // Whatever
          Whatever.printOrigin(); // Whatever

          3. 抽象關(guān)鍵字abstract
          用來定義抽象類或抽象函數(shù),面向?qū)ο缶幊毯苤匾囊画h(huán)(沒對(duì)象的都面向屏幕編程吧,淚目)
          abstract class Animal {
              abstract eat(): void; // 不同動(dòng)物進(jìn)食的方式不一樣
          }

          let animal = new Animal(); // 報(bào)錯(cuò),法實(shí)例化抽象類無

          class Dog implements Animal {
              eat() {
                  console.log('我吃,汪!');
              }
          }

          let dog = new Dog();
          dog.eat(); // 我吃,汪!

          class Cat implements Animal {
              // 報(bào)錯(cuò)了,沒有實(shí)現(xiàn)進(jìn)食的功能
          }

          4. 只讀關(guān)鍵字readonly
          用來定義只讀的字段,使得字段只能在創(chuàng)建的時(shí)候賦值一次。
          class Human {
              name: string;
              readonly id: number;
              constructor(name: string, id: number) {
                  this.name = name;
                  this.id = id;
              }
          }

          let human = new Human('陳皮皮', 666666);
          human.name = '陳不皮'; // 名字可以改
          human.id = 999999; // 報(bào)錯(cuò),身份證號(hào)碼一旦確定不能更改


          • 接口
          ( C# 和 Java 的朋友們讓我看到你們的雙手好嗎)
          接口(interface)用于一系列成員的聲明,但不包含實(shí)現(xiàn),接口支持合并(重復(fù)聲明),也可以繼承于另一接口。下面給大家展示幾個(gè)常見的用法:

          1. 擴(kuò)展原始類型
          // 擴(kuò)展 String 類型
          interface String {

              /**
               * 翻譯
               */

              translate(): string;

          }

          // 實(shí)現(xiàn)翻譯函數(shù)
          String.prototype.translate = function () {
              return this; // 不具體寫了,直接返回原字符串吧
          };

          // 使用
          let nickname = '陳皮皮'.translate();

          2. 定義類型
          interface Human {
              name: string; // 普通屬性,必須有但是可以改
              readonly id: number; // 只讀屬性,一旦確定就不能更改
              hair?: number; // 可選屬性,挺禿然的
          }

          let ChenPiPi: Human = {
              name: '陳皮皮',
              id: 123456789,
              hair: 9999999999999
          }

          3. 類實(shí)現(xiàn)接口
          interface Vehicle {
              wheel: number;
              engine?: string;
              run(): void;
          }

          class Car implements Vehicle {
              wheel: 4;
              engine: '帝皇引擎';
              run() {
                  console.log('小汽車跑得快!')
              }
          }

          class Bike implements Vehicle {
              wheel: 2;
              run() {
                  console.log('小黃車沖沖沖!')
              }
          }


          • 類型別名
          這是一個(gè)比較常用的特性,作用如其名。
          類型別名(type)用來給類型起一個(gè)新的名字。
          type 和接口(interface)很相似,type 可以作用于原始類型,聯(lián)合類型,元組以及其它任何你需要手寫的類型,interface 支持合并而 type 不可以。
          type 同樣也支持?jǐn)U展,并且可以和接口互相擴(kuò)展。
          // 給原始類型起個(gè)小名
          type UserName = string;
          let userName: UserName = '陳皮';

          // 還可以是函數(shù)
          type GetString = () => string;
          let getString: GetString = () => {
              return 'i am string';
          }
          let result = getString();

          // 創(chuàng)建一個(gè)新的類型
          type Name = {
              realname: string;
              nickname: string;
          }
          let name: Name = {
              realname: '吳彥祖',
              nickname: '陳皮皮'
          }
          // 再來一個(gè)新的類型
          type Age = {
              age: number;
          }
          // 用上面兩個(gè)類型擴(kuò)展出新的類型
          type User = Name & Age;
          let user: User = {
              realname: '吳彥祖',
              nickname: '陳皮皮',
              age: 18,
          }


          • 聯(lián)合類型
          使用聯(lián)合類型(Union Types)允許你在聲明變量或接收參數(shù)時(shí)兼容多種類型。
          個(gè)人最喜歡的特性之一,點(diǎn)贊!

          1. 表示一個(gè)值可以是幾種類型之一
          let bye: string | number;
          bye = 886; // 不報(bào)錯(cuò)
          bye = 'bye'; // 不報(bào)錯(cuò)
          bye = false; // 報(bào)錯(cuò)

          2. 讓函數(shù)接受不同類型的參數(shù),并在函數(shù)內(nèi)部做不同處理
          function padLeft(value: string, padding: string | number) {
              if (typeof padding === 'string') {
                  return padding + value;
              } else {
                  return Array(padding + 1).join('') + value;
              }
          }

          padLeft('Hello world', 4); // 返回 '    Hello world'
          padLeft('Hello', 'I said: '); // 返回 'I said: Hello'


          • 泛型
          ( C# 和 Java 的朋友們?cè)俅巫屛铱吹侥銈兊碾p手好嗎)
          使用泛型可以讓一個(gè)/函數(shù)支持多種類型的數(shù)據(jù),使用時(shí)可以傳入需要的類型。
          又是一個(gè)非常實(shí)用的特性,利用泛型可以大大增加代碼的可重用性,減少重復(fù)的工作,點(diǎn)贊!
          以下是兩個(gè)常用的用法:

          1. 泛型函數(shù)
          // 這是一個(gè)清洗物品的函數(shù)
          function wash<T>(item: T): T {
              // 假裝有清洗的邏輯...
              return item;
          }

          class Dish { } // 這是盤子
          let dish = new Dish(); // 來個(gè)盤子
          // 盤子洗完還是盤子
          // 用尖括號(hào)提前告訴它這是盤子
          dish = wash<Dish>(dish);

          class Car { } // 這是汽車
          let car = new Car(); // 買輛汽車
          // 汽車洗完還是汽車
          // 沒告訴它這是汽車但是它認(rèn)出來了
          car = wash(car);

          2. 泛型類
          // 盒子
          class Box<T>{
              item: T = null;
              put(value: T) {
                  this.item = value;
              }
              get() {
                  return this.item;
              }
          }

          let stringBox = new Box<String>(); // 買一個(gè)用來裝 String 的盒子
          stringBox.put('你好!'); // 存一個(gè) '你好!'
          // stringBox.put(666); // 報(bào)錯(cuò),只能存 String 類型的東西
          let string = stringBox.get(); // 拿出來的是 String 類型


          • 裝飾器
          這是一個(gè)相對(duì)比較高級(jí)的特性,以 @expression 的形式對(duì)類、函數(shù)、訪問符、屬性或參數(shù)進(jìn)行額外的聲明。
          利用裝飾器可以做很多騷操作,感興趣的話可以深入研究下。

          1. 對(duì)類做預(yù)處理
          export function color(color: string) {
              return function (target: Function) {
                  target.prototype.color = color;
              }
          }

          @color('white')
          class Cloth {
              color: string;
          }
          let cloth = new Cloth();
          console.log(cloth.color); // white

          @color('red')
          class Car {
              color: string;
          }
          let car = new Car();
          console.log(car.color); // red

          2. Creator 中的 TS 組件中的 ccclass 和 property 就是兩個(gè)裝飾器
          const { ccclass, property } = cc._decorator;

          @ccclass
          export default class CPP extends cc.Component {

              @property(cc.Node)
              private abc: cc.Node = null;

          }

           


          • 命名空間
          命名空間(namespace)用來定義標(biāo)識(shí)符的可用范圍,主要用于解決重名的問題,對(duì)于項(xiàng)目模塊化有很大的幫助。
          Cocos Creator 中的 cc 就是一個(gè)內(nèi)置的命名空間。

          1. 對(duì)相同名字的類和函數(shù)進(jìn)行區(qū)分
          // pp 命名空間
          namespace pp {
              export class Action {
                  public static speak() {
                      cc.log('我是皮皮!');
                  }
              }
          }

          // dd 命名空間
          namespace dd {
              export class Action {
                  public static speak() {
                      cc.log('我是弟弟!');
                  }
              }
          }

          // 使用
          pp.Action.speak(); // 我是皮皮!
          dd.Action.speak(); // 我是弟弟!

          2. 對(duì)接口進(jìn)行分類
          namespace Lobby {
              export interface Request {
                  event: string,
                  other: object
                  // ...
              }
          }

          namespace Game {
              export interface Request {
                  event: string,
                  status: string
                  // ...
              }
          }

          // 用于 Lobby 的請(qǐng)求函數(shù)
          function requestLobby(request: Lobby.Request) {
              // ...
          }

          // 用于 Game 的請(qǐng)求函數(shù)
          function requestGame(request: Game.Request) {
              // ...
          }


          • 聲明文件
          聲明文件(Declaration Files),即以 d.ts 作為后綴的代碼文件,用來聲明當(dāng)前環(huán)境中可用的類型。

          聲明文件這一特性對(duì)于 TypeScript 來說是極其重要的,代碼編輯器中的智能提示等特性都依賴于聲明文件。

          可以發(fā)現(xiàn)目前大多數(shù)第三方 JavaScript 都有聲明文件,聲明文件讓這些庫在代碼編輯器中也可以擁有類型檢查智能提示等特性,使用體驗(yàn) Max 。

          我們甚至可以聲明一些環(huán)境中不存在的類型,例如我在《微信小游戲接入好友排行榜》這篇文章中編寫的 wx.d.ts 文件,使得我在編輯器環(huán)境中調(diào)用根本不存在的 wx 函數(shù)時(shí)不會(huì)報(bào)錯(cuò)且智能提示。

          一般 Cocos Creator 項(xiàng)目的根目錄下都有一個(gè)聲明文件 creator.d.ts ,文件中聲明了 Cocos Creator 引擎幾乎所有可用的 API 。所以即使是純 JavaScript 的 Creator 項(xiàng)目,使用 cc 命名空間時(shí)也有智能提示。

          Creator 中 TS 和 JS 在使用上的區(qū)別


          • 聲明組件

          在 TypeScript 腳本中 class 的聲明方式 和 ES6 Class 相似,并使用了裝飾器 @ccclass 來將普通 class 聲明成 CCClass :
          const { ccclass } = cc._decorator;

          @ccclass
          export default class Test extends cc.Component {


          }

          在 JavaScript 腳本中聲明的方式:
          cc.Class({
              extends: cc.Component,

          });


          • 聲明屬性
          在 TypeScript 腳本中需要使用裝飾器 @property 來聲明屬性,基本類型可以不傳參數(shù)(參數(shù)和使用 JavaScript 時(shí)基本一致)
          const { ccclass, property } = cc._decorator;

          @ccclass
          export default class Test extends cc.Component {

              @property
              myNumber: number = 666;

              @property
              myString: string = '666';

              @property
              myBoolean: boolean = true;

              @property(cc.Node)
              myNode: cc.Node = null;

              @property([cc.Node])
              myNodes: cc.Node[] = [];

              @property({
                  visible: true,
                  displayName: '位置',
                  tooltip: '就是一個(gè)位置'
              })
              myVec2: cc.Vec2 = new cc.Vec2();

              @property({
                  type: cc.Sprite,
                  visible() { return this.myBoolean },
                  tooltip: '當(dāng) myBoolean 為 true 才會(huì)展示該屬性'
              })
              mySprite: cc.Sprite = null;

              @property
              _getset = 0;
              @property
              get getset() { return this._getset }
              set getset(value) { this._getset = value }

          }

          在 JavaScript 腳本中需要在 properties 中定義屬性(使用時(shí)沒有智能提示,就很難受)
          cc.Class({
              extends: cc.Component,

              properties: {
                  myNumber: 666,
                  myString: '666',
                  myBoolean: true,
                  myNode: cc.Node,
                  myNodes: [cc.Node],
                  myVec2: {
                      default: new cc.Vec2(),
                      visible: true,
                      displayName: '位置',
                      tooltip: '就是一個(gè)位置'
                  },
                  mySprite: {
                      type: cc.Sprite,
                      default: null,
                      visible() { return this.myBoolean },
                      tooltip: '當(dāng) myBoolean 為 true 才會(huì)展示該屬性'
                  },
                  _getset: 0,
                  getset: {
                      get() { return this._getset; },
                      set(value) { this._getset = value; }
                  }
              }

          });


          • 導(dǎo)入/導(dǎo)出組件/模塊
          在 TypeScript 腳本中使用 ES 模塊的方式來導(dǎo)出或?qū)虢M件/模塊:
          // A.ts
          const { ccclass, property } = cc._decorator;

          @ccclass
          export default class A extends cc.Component {

              @property
              public nickname: string = 'A';

              public greet() {
                  cc.log('A: greet()');
              }

          }

          // B.ts
          import A from "./A";

          const { ccclass, property } = cc._decorator;

          @ccclass
          export default class B extends cc.Component {

              @property(A)
              private a: A = null;

              onLoad() {
                  // 訪問實(shí)例屬性
                  let nickname = this.a.nickname;
                  // 調(diào)用實(shí)例函數(shù)
                  this.a.greet();
              }

          }

          在 JavaScript 腳本中使用的是 Common JS 模塊的方式(其實(shí) cc.Class 會(huì)默認(rèn)導(dǎo)出,但是 VS Code 識(shí)別不了,所以一般都會(huì)用 module.export 導(dǎo)出。且使用時(shí)也沒有智能提示全靠手打
          // A.js
          let A = cc.Class({
              extends: cc.Component,

              properties: {
                  nickname: 'A'
              },

              greet() {
                  cc.log('A: greet()');
              }

          });

          module.export = A;

          // B.js
          let A = require('./A');

          let B = cc.Class({
              extends: cc.Component,

              properties: {
                  a: {
                      type: A,
                      default: null
                  }
              },

              onLoad() {
                  // 訪問實(shí)例屬性
                  let nickname = this.a.nickname;
                  // 調(diào)用實(shí)例函數(shù)
                  this.a.greet();
              }

          });

          module.export = B;


          • 靜態(tài)變量/函數(shù)
          在 TypeScript 腳本中直接使用 static 關(guān)鍵字聲明靜態(tài)變量和函數(shù):
          // A.ts
          const { ccclass, property } = cc._decorator;

          @ccclass
          export default class A extends cc.Component {

              public static id: number = 999999;

              public static staticGreet() {
                  cc.log('A: staticGreet()');
              }

          }

          // B.ts
          import A from "./A";

          const { ccclass, property } = cc._decorator;

          @ccclass
          export default class B extends cc.Component {

              onLoad() {
                  // 訪問靜態(tài)屬性
                  let id = A.id;
                  // 調(diào)用靜態(tài)函數(shù)
                  A.staticGreet();
              }

          }

          在 JavaScript 腳本中使用 static 屬性來定義靜態(tài)變量或函數(shù)(使用時(shí)沒有智能提示全靠手打)
          // A.js
          let A = cc.Class({
              extends: cc.Component,

              static: {
                  id: 999999,

                  staticGreet() {
                      cc.log('A: staticGreet()');
                  }
              }

          });

          module.export = A;

          // B.js
          let A = require('./A');

          let B = cc.Class({
              extends: cc.Component,

              onLoad() {
                  // 訪問靜態(tài)變量
                  let id = A.id;
                  // 調(diào)用靜態(tài)函數(shù)
                  A.staticGreet();
              }

          });

          module.export = B;


          • 枚舉

          上面也有說到 TS 自帶枚舉類型,所以在 TS 腳本中可以直接 enum 來定義枚舉,而在 JS 腳本中需要用 cc.Enum 來定義枚舉。
          // TypeScript 腳本的方式
          enum 
          Direction {
              Up = 1,
              Down,
              Left,
              Right
          }

          // JavaScript 腳本的方式
          const 
          Direction = cc.Enum({
              Up = 1,
              Down,
              Left,
              Right
          });

          如何創(chuàng)建 Creator TS 項(xiàng)目 


          新建項(xiàng)目時(shí),在項(xiàng)目模板中選擇 Hello TypeScript ,就可以創(chuàng)建一個(gè)含有 TypeScript 相關(guān)配置和基本組件的項(xiàng)目。

          原有的 JS 項(xiàng)目使用 TS


          想要在原有的 JavaScript Creator 項(xiàng)目中使用 TypeScript ,需要點(diǎn)擊編輯器上方主菜單的 [開發(fā)者 -> VS Code 工作流 -> 更新 VS Code 智能提示數(shù)據(jù)] 和 [開發(fā)者 -> VS Code 工作流 -> 添加 TypeScript 項(xiàng)目配置] 來給項(xiàng)目添加 creator.d.ts 聲明文件和 tsconfig.json 配置文件。
          • creator.d.ts 是 Cocos Creator 引擎 API 的聲明文件

          • tsconfig.json 是 TypeScript 項(xiàng)目的環(huán)境配置文件


          在 Creator 項(xiàng)目中可以混用 JS 和 TS 腳本,也能享受到 TS 到來的福利。也就是說原有的 JS 腳本可以保留,不影響后續(xù)添加新的 TS 腳本。

          但是如果想要將項(xiàng)目完全重構(gòu)為 TS 項(xiàng)目,要做的就是將原有的 JS 腳本逐個(gè)修改為 TS 腳本,并對(duì)腳本內(nèi)的寫法進(jìn)行轉(zhuǎn)換。
          對(duì)于較為復(fù)雜的項(xiàng)目,對(duì)項(xiàng)目代碼進(jìn)行重構(gòu)這一行為可能需要花費(fèi)較長的時(shí)間,如果沒有做好充足的準(zhǔn)備,不建議著手進(jìn)行。
          但是一旦完成重構(gòu),TS 絕不會(huì)讓你失望,必定會(huì)給項(xiàng)目開發(fā)帶來全方位的提升!


          本文由“壹伴編輯器”提供技術(shù)支


          學(xué)習(xí)資料


          TypeScript 官網(wǎng)
          https://www.typescriptlang.org

          TypeScript 中文網(wǎng)
          https://www.tslang.cn

          TypeScript  開源代碼倉庫
          https://github.com/Microsoft/TypeScript

          Cocos Creator TypeScript 使用文檔
          https://docs.cocos.com/creator/manual/zh/scripting/typescript.html

          TypeScript 入門教程 by xcatliu
          https://github.com/xcatliu/typescript-tutorial

          ECMAScript 6 入門 by 阮一峰
          https://es6.ruanyifeng.com

          awesome-typescript by semlinker
          https://github.com/semlinker/awesome-typescript


          本文由“壹伴編輯器”提供技術(shù)支

          結(jié)束語

          以上內(nèi)容皆為陳皮皮的個(gè)人觀點(diǎn)。

          小生不才,文采不佳,如果寫得不好還請(qǐng)各位多多包涵。如果有哪些地方說的不對(duì),還請(qǐng)各位指出,希望與大家共同進(jìn)步。

          接下來我會(huì)持續(xù)分享自己所學(xué)的知識(shí)與見解,歡迎各位關(guān)注本公眾號(hào)

          我們,下次見!

          本文由“壹伴編輯器”提供技術(shù)支

          往期精彩


          瀏覽 97
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  一级二级在线观看网站 | 男人的天堂黄色 | 亚洲无码视频看看 | 久久大香蕉视频 | 亚洲性爱自拍 |