ts 學(xué)習(xí)備忘(持續(xù)更新)

一、環(huán)境配置

Sublime 3搭建TypeScript開發(fā)環(huán)境
LayaAir引擎入門教程:一篇學(xué)會(huì)用TypeScript語言開發(fā)HTML5
使用VS Code調(diào)試TypeScript游戲程序JsTankGame成功?。?!
Visual Studio Code的插件debugging in chrome怎么配置
版本不匹配! 全局 tsc (2.2.2) != VS Code 的語言服務(wù)(2.1.5)。可能出現(xiàn)不一致的編譯錯(cuò)誤
示例代碼下面的*.js.map文件是干嘛的
source map,主要是方便chrome調(diào)試用,用來對(duì)應(yīng)某行js代碼對(duì)應(yīng)的原ts的路徑和行號(hào)。Chrome中的js調(diào)試器會(huì)在加載js時(shí)嘗試加載同路徑下的.map,然后根據(jù)map信息,嘗試下載對(duì)應(yīng)的ts代碼,如果以上兩步都成功完成,那么在給js下斷點(diǎn)是就會(huì)下到對(duì)應(yīng)的ts代碼中的正確位置上。
如果不需要,可以在編譯時(shí)調(diào)整.laya/launch.json中的sourceMaps選項(xiàng),或者如果是自己調(diào)用tsc編譯的,就調(diào)整tsconfig.json中的"sourceMap"開關(guān)。

二、快捷鍵

VS Code折騰記 - (2) 快捷鍵大全,沒有更全
備注一下自己常用的:

Shift+F12 找到所有的引用
Ctrl + G    跳轉(zhuǎn)行
Ctrl + Shift + K    刪除行
Ctrl + P    打開資源
Shift+Alt+F 代碼格式化:
Ctrl + Shift + | 匹配花括號(hào)的閉合處,跳轉(zhuǎn)
Alt + up/down   移動(dòng)行上下
Ctrl + /    添加關(guān)閉行注釋
三、關(guān)鍵字let const

自己在laya的TS開發(fā)中用了let,出現(xiàn)莫名錯(cuò)誤,還是不要換了
很多常見的問題都可以通過使用let來解決,所以盡可能地使用let來代替var吧。
let和var定義變量的區(qū)別
使用VS Code開發(fā)TypeScript--定義變量推薦使用let
Javascript 嚴(yán)格模式詳解

(function() {
  var varTest = 'test var OK.';
  let letTest = 'test let OK.';

  {
    var varTest = 'varTest changed.';
    let letTest = 'letTest changed.';
  }
  //輸出"varTest changed.",內(nèi)部"{}"中聲明的varTest變量覆蓋外部的letTest聲明
  console.log(varTest);
  //輸出"test let OK.",內(nèi)部"{}"中聲明的letTest和外部的letTest不是同一個(gè)變量
  console.log(letTest); 
}());

ES6新增let和const兩個(gè)變量聲明命令,const與let不同點(diǎn)在于:

  • const如果聲明的變量是簡(jiǎn)單的值,則不能改變變量的值,修改會(huì)報(bào)錯(cuò);
  • const如果聲明的是復(fù)合類型的變量,則只保證變量地址不變,值可以變;
四、箭頭函數(shù)自動(dòng)將函數(shù)中的this附加到上下文中

一步一步學(xué)習(xí)TypeScript(11.Arrow Functions_箭頭函數(shù)?)

function Arrow(age){
    this.age = age;

    this.add= function(){
        this.age ++;
        console.log(this.age);
    }
}

var arrow2 = new Arrow(10);
setTimeout(arrow2.add, 1000);  //期望值為11, 結(jié)果卻是NaN.
//原因是setTimeout執(zhí)行的上下文環(huán)境為window,使得add方法中的this脫離了原上下文而指向了window. 

function Arrow1(age){
    this.age = age;

    this.add= ()=>{
        this.age ++;
        console.log(this.age);
    }
}

var arrow2 = new Arrow1(10);
setTimeout(arrow2.add, 1000); //11, 結(jié)果正確

//打開ts編譯后的js代碼
function Arrow1(age) {
    var _this = this;   //自動(dòng)創(chuàng)建了一個(gè)_this變量,指向了當(dāng)前上下文.
    this.age = age;
    this.add = function () {
        _this.age++; //在這里程序使用的是之前創(chuàng)建的_this中保存的上下文環(huán)境,而不是`this`
        console.log(_this.age);
    };
}

var arrow2 = new Arrow1(10);
setTimeout(arrow2.add, 1000);
五、TS語法基礎(chǔ)

TypeScript Handbook(中文版)
https://www.tslang.cn/docs/home.html
從 ActionScript3 到 TypeScript(一)
從 ActionScript3 到 TypeScript(二)

類型推理var display = new Shape();
復(fù)合類型public source:BitmapData|string;
可以少寫一個(gè)vo類

function CalculateArea(rect: {width:number; height:number; depth?:number;}): number
{}

TypeScript進(jìn)階玩法
JavaScript秘密花園
TyptScript語言手冊(cè)
typescript-any-vs-object
枚舉enum

六、TS調(diào)用第三方JS

ts(Egret) 與 js 的調(diào)用
tsd-提升IDE對(duì)JavaScript智能感知的能力
如何生成 .d.ts
cuixu.js:

function test(){
    console.log("cuixu test");
}

index.html中進(jìn)行加載:

<!--jsfile--startTag-->
    <script src="js/cuixu.js"></script>
<!--jsfile--endTag-->

libs/cuixu.d.ts 添加聲明

declare function test(): void;

LayaSample.ts中直接調(diào)用test()方法

七、Laya中自定義組件

自定義組件
把layaeditor.d.ts放到與LayaAir.d.ts同級(jí)即可

八、Object

ES5對(duì)象與ES6 Maps的異同
JavaScript對(duì)象詳解
JavaScript Object 對(duì)象詳解
參考TypeScript學(xué)習(xí)筆記(二):基本數(shù)據(jù)類型及數(shù)據(jù)轉(zhuǎn)換
Object可以當(dāng)做Hash表來使用,如下:

var obj: Object = {};

function run() {
    obj["a"] = 123;
    //obj.b = "asdf";//這種寫法是錯(cuò)誤的
    obj["b"] = "asdf";
    obj[100] = true;

    delete obj["100"];//刪除使用 delete 關(guān)鍵字

    for (var key in obj) {
        alert(key);
        alert(obj[key]);
    }
}
run();
九、$字符串插值

https://rexdainiel.gitbooks.io/typescript/content/docs/template-strings.html
typescript使用${}字符串拼接方法

let v0:string='這個(gè)是電壓'
let v1:number=220.35;
let str=`這個(gè)是格式化字符串(${v0}:${v1}V)`;
console.log(str)
//這個(gè)是格式化字符串(這個(gè)是電壓:220.35V)

需要注意的是任何在插值(${ 和 })里的占位符都會(huì)被當(dāng)成 JavaScript 表達(dá)式來執(zhí)行,例如:你可以做數(shù)學(xué)計(jì)算。

console.log(`1 and 1 make ${1 + 1}`);
十、回調(diào)函數(shù)

TypeScript: this bind 和 回調(diào)的正確用法

namespace naiking
{
    /**
     *author     : NaiKing
     *description: 
     */
    export class TestCallAndThis {
        /**
         * 不推薦的回調(diào)寫法
         * 外部調(diào)用必須【必須】【必須】在回調(diào)參數(shù)方法后面添加.bind(this),
         * 否則可能會(huì)this異常
         */
        public static callBackTest(arg:number,callBack:Function):void
        {
            //返回 2 x arg
            let result:number=arg*2;
            //不推薦直接調(diào)用回調(diào)方法,應(yīng)使用callBack.call(caller,result);
            callBack(result);
        }
        /**
         * 推薦的回調(diào)寫法
         * @param arg 參數(shù)
         * @param caller 調(diào)用域 
         * @param method 指定的回調(diào)方法(兼容.bind(this) 也可以不加.bind(this) )
         */
        public static callMethod(arg:number,caller:any,method:Function):void
        {
            //返回 2 x arg
            let result:number=arg*2;
            //推薦的做法 .call(caller,result);
            method.call(caller,result);
           
        }
    }
}

推薦第二種寫法

namespage naiking
{
   export class Luna
   {    //注意觀察,this異常的時(shí)候的isLoading的值是undefind
      private isLoading:boolean = false;
      private getResult(rst:number):void
      {
          console.log("get rusult:"+rst+this.isLoading);
        
      }
      constructor()
      {
          //不推薦的回調(diào)寫法, 遺漏了bind(this)
          logic.TestCallAndThis.callBackTest(1,this.getResult);
          //不推薦的回調(diào)寫法, 使用了bind(this)( √ )
          logic.TestCallAndThis.callBackTest(1,this.getResult.bind(this));
        
          //提倡的回調(diào)寫法 ,有無bind(this)都可以
          logic.TestCallAndThis.callMethod(1,this,this.getResult);
          logic.TestCallAndThis.callMethod(1,this,this.getResult.bind(this));
      }   }}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容