owned this note
owned this note
Published
Linked with GitHub
# TypeScript Manual
## var / let / const
**var** 存在 **Hoisting**, **Scoping**, **Capturing** 等三大問題
**let** 則是為了解決 var 的問題而誕生,你可以把他理解為 C# 的 var
**const** 與 let 相似,差別在於 const 是不會變動的
## async / await
**Promise** 提供的語法糖,讓非同步函數的寫法向同步函數靠攏, 但不支援取消的功能
---
### 類似C#的region用法
```
// #region ABC
...
// #endregion
```
---
### 類似C#的summary用法
在多行註解 **/\* \*/** 的前半段, 多加一個星號
```
/**測試*/
function test():void { }
```
---
### namespace alias
C# 用 **using**, TypeScript 用 **import**
```
import GParticleSys = particle.GravityParticleSystem;
```
---
### 存取 namespace 內的自訂 class
class 前面加上 **export**
```
namespace ABC{
export class XYZ{
static do():void{}
}
}
```
```
ABC.XYZ.do();
```
---
### 註冊鍵盤按下事件
```
init():void {
document.addEventListener("keydown", this.onKeydown);
}
onKeydown(evt:KeyboardEvent):void {
//判斷是否按下空白鍵, 2種不同的用法
if(evt.key == " "){}
if(evt.code == "Space"){}
//這裡的 this 是 document
//如果直接呼叫 this.OnExecute() 一定找不到, 要呼叫class實體才行
}
onExecute():void {}
```
為了避免混淆, 可以這樣寫, 但目標 function 必須是公開的
```
document.addEventListener("keydown", function(evt:KeyboardEvent){
//這裡再去呼叫 class的實體.onExecute()
});
```
或者這樣寫, 就可以用 **this**
```
document.addEventListener("keydown", (evt:KeyboardEvent) => {
this.onExecute();
});
```
### 多按鍵偵測
* 單純註冊 keydown 事件, 一次只會觸發一個按鍵事件, 無法同時處理多個按鍵, 解法如下
1. 需要註冊 **keydown** 和 **keyup** 事件來設定 flag
2. 註冊 **ENTER_FRAME** 事件 (作用和 unity MonoBehaviour 的 Update() 相同)
3. 在 **ENTER_FRAME** 觸發的 callback 裡面自行判斷
```
this.addEventListener(egret.Event.ENTER_FRAME, 自訂callback, this);
```
* [Key code 對應表](https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/code/code_values)
---
### js轉換ts
(判斷A) && (function A) => 判斷A為true時 執行A
(判斷B) || (function B) => 判斷B為false時 執行B
## js:
```
var MyClass = (function () {
function MyClass() { }
Object.defineProperty(MyClass.prototype, "View", {
get: function () {
return this.view;
},
set: function (value) {
this.view = value;
},
enumerable: true,
configurable: true
});
return MyClass;
})();
```
## ts:
```
class MyClass {
private view;
get View() { return this.view; }
set View(value) { this.view = value }
}
```
## Array 操作
### Cannot read property 'push' of undefined
```
let myArray: number[]; // 沒有設定初始值
array.push(obj); // error occur: Cannot read property 'push' of undefined
```
:::danger
編譯後的 Javascript 為:
```
let myArray; <--- undefined
array.push(obj);
```
:::
```
let myArray: number[] = []; // 設定初始值
array.push(obj);
```
:::success
編譯後的 Javascript 為:
```
let myArray = []; <--- define as array
array.push(obj);
```
:::
---
## 如何避免VS自動產生 .js 和 .map 檔案
:::success
專案目錄新增 **tsconfig.json** 輸入以下內容
```
{
"compilerOptions": {
"outDir": "資料夾名稱"
}
}
```
:::
---
### module 和 namespace 的差異
| | module | namespace |
|--|--| --|
| ts 1.5以前的名稱 | external module | internal module |
| 如何引用 | 需要先 import | 直接呼叫 |
| export差異 | 需要加上 export | export代表對外開放 |
---
### iframe雙向溝通
* parent to child
```typescript
target: HTMLIFrameElement;
...
target.contentWindow.postMessage("訊息", "*");
```
* child to parent
```typescript
window.parent.postMessage("訊息", "*")
```
* 事件接收
```typescript=
window.addEventListener("message", this.onEvent, false);
...
onEvent = (evt:MessageEvent) => {
console.log(evt.data);
};
```
---
## 字串比較
:::success
使用 [localeCompare()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/localeCompare)
```typescript=
let a = "AAA";
let b = "aaa";
console.log(a.localCompare(b, "en", { sensitivity: "case" }));
```
| sensitivity 參數 | 基本字母 | 大小寫 | 輕重音 |
| -- | -- | -- | -- |
| base | <font color="red">檢查</font> | 忽略 | 忽略 |
| accent | <font color="red">檢查</font> | 忽略 | <font color="red">檢查</font> |
| case | <font color="red">檢查</font> | <font color="red">檢查</font> | 忽略 |
| variant (預設值) | <font color="red">檢查</font> | <font color="red">檢查</font> | <font color="red">檢查</font> |
```typescript=
let a = "Antonio"
let b = "antónio"
console.log("base => " + a.localeCompare(b, "en", { sensitivity: 'base' }));
console.log("accent => " + a.localeCompare(b, "en", { sensitivity: 'accent' }));
console.log("case => " + a.localeCompare(b, "en", { sensitivity: 'case' }));
console.log("variant => " + a.localeCompare(b, "en", { sensitivity: 'variant' }));
/*輸出結果
base => 0
accent => -1
case => 1
variant => -1
*/
```
[參考文件](https://www.techonthenet.com/js/string_localecompare.php)
:::
---
## 學習資源
* [MagicLen的TypeScript學習之路](https://magiclen.org/tag/typescript-學習之路/)
* [Do's and Don'ts](https://www.typescriptlang.org/docs/handbook/declaration-files/do-s-and-don-ts.html)
###### tags: `教學`