由於不少工做崗位要求程序員會typescript了,畢竟也是個趨勢, 雖然本人是入門級別的程序員,也要遇上時代潮流, 學習學習typescript。程序員
主要是如今開發要引用不少的插件, 想看看插件源碼,按住alt點擊函數, 打開以後是ts文件,本身看不懂ts,有時也會出現不知道是否是本身哪裏寫錯了之類的,技多不壓身,學習ts勢在必行typescript
cnpm -g i typescript
npm
tsc test.ts
tsc: typescript compilejson
tsc --init
默認狀況下,執行tsc會將當前目錄下,以及子目錄下的ts文件所有轉換成js文件數組
js並不會出現類型檢查的語句, 好比bash
if(typeof 123 !=='string'){
throw 'Type 123 is not assignable to type 'string' } 複製代碼
由於在編譯以前就會執行檢查函數
let num = 3;
num = 4;
//下面這句會報錯!由於類型已經被定義成數字類型
num = true;
複製代碼
let a;
let b: any;
let udf = undefined;
let nl = null;
// 若是不賦值,或者是null, 就是any(也就是能夠隨意賦值)
a = 1;
a = 'a';
b = 2;
b = 'b';
udf = function () { };
udf = 0;
udf = true;
nl = setTimeout(() => { });
nl = function () { };
複製代碼
// ts原型,原始值的原型是小寫字母, string, boolean, number
// 使用冒號來定義類型
let num5: number = 5; // 數字
let boolean1: boolean = true; // 布爾值
let str: string = '你好'; //字符串
複製代碼
let num = 3;
let float = 1.00;
let hex = 0x6;
let binary = 0b1010;
let octal = 0o675;
// 默認類型是初始設置的類型;
// 一開始給他賦值是什麼, 那麼他後來就是什麼類型的
複製代碼
let hworld: Array<string> = ['你好', '世界'];
let fun: Function = function () { };
let obj: Object = { name: 'lyz' };
let reg: RegExp = /\d/g;
複製代碼
/* 數組 */
// 裏面必須是字符串類型的, 定義所有的類型
let hworld: Array<string> = ['你好', '世界'];
···
元組 按照索引定義數組裏面的類型
···
/* 元組 */
// 裏面是任意類型的數組
let arr: any[] = [1, true, {}, [], 'abc']
// 按索引指定類型
let color: [string, number, number, number] = ['red', 255, 0, 0];
···
枚舉(只能在指定的枚舉對象裏面挑數據)
···
/* 枚舉 */
enum Vegetable {
Broccly,
Cucumber,
Tomato
}
enum Fruit {
Apple,
Pear,
Grape
}
let food1: Fruit = Fruit.Apple;
let food2: Vegetable = Vegetable.Broccly;
// 若是選錯了枚舉對象,會報錯
// let food3: Fruit = Vegetable.Broccly;
//報錯類型錯誤: Type 'Vegetable.Broccly' is not assignable to type 'Fruit'
// 編譯成js文件以後的枚舉
var Vegetable;
(function (Vegetable) {
Vegetable[Vegetable["Broccly"] = 0] = "Broccly";
Vegetable[Vegetable["Cucumber"] = 1] = "Cucumber";
Vegetable[Vegetable["Tomato"] = 2] = "Tomato";
})(Vegetable || (Vegetable = {}));
var Fruit;
(function (Fruit) {
Fruit[Fruit["Apple"] = 0] = "Apple";
Fruit[Fruit["Pear"] = 1] = "Pear";
Fruit[Fruit["Grape"] = 2] = "Grape";
})(Fruit || (Fruit = {}));
var food1 = Fruit.Apple;
var food2 = Vegetable.Broccly;
複製代碼
打印下來的枚舉學習
{ '0': 'Apple',
'1': 'Pear',
'2': 'Grape',
Apple: 0,
Pear: 1,
Grape: 2 }
複製代碼
// 返回字符串
function foo(): string {
return 'hello world';
}
// 返回空數組
function foo2(): Array<void> {
return [];
}
// 什麼都不返回
function foo3(): void {
}
//不定義返回值不會報錯
function foo4() {
return true;
}
複製代碼
// 定義參數類型
// 參數類型不定義會報警告!
function getType(value: any) {
// 至關於 var value1, value2
return typeof value;
}
// function getType(value) {
// return typeof value;
// // 報警告 : Parameter 'value' implicitly has an 'any' type.
// }
複製代碼
//定義一個函數類型 (這個並非件箭頭函數)
let fn1 : (a: number, b: number) => number ;
//讓這個函數類型等於一個函數
var foo = function (a, b) {
return a + b;
}
fn1 = foo;
fn1 =(1,2);
複製代碼
//編譯前的ts
let fn2: (a: number, b: number) => number = (a, b) => {
console.log(this);
return a + b;
}
fn2(2);
let rectanglePerimeter: (a: number, b: number) => number = function (width, height) {
console.log(this);
return (width + height) * 2
}
rectanglePerimeter(10, 20)
複製代碼
//編譯以後
var _this = this;
var fn2 = function (a, b) {
console.log(_this);
return a + b;
};
fn2(2);
var rectanglePerimeter = function (width, height) {
console.log(this);
return (width + height) * 2;
};
rectanglePerimeter(10, 20);
複製代碼
// //定義對象類型
let student: { name: string, age: number } = {
name: "lyz",
age: 24
};
// // 修改對象
student = {
name: 'jelly',
age: 25
}
複製代碼
let hybridObj: { data: number[]; getPow: (pow: number) => number[] } = {
data: [1, 2, 3],
getPow: function (pow) {
return this.data.map((ele) => {
return ele ** pow;
})
}
}
console.log(hybridObj.getPow(2))
複製代碼
或者 使用type關鍵字ui
type obj2Type = { data: number[]; getPow: (pow: number) => number[] };
let hybridObj2: obj2Type = {
data: [1, 2, 3],
getPow: function (pow) {
return this.data.map((ele) => {
return ele ** pow;
})
}
}
console.log(hybridObj2.getPow(2));
複製代碼