type-script入門

1. 安裝

  1. 下載vcode
    按ctrl+k ctrl+l炕泳,然后搜索格式化文件吮成,設(shè)置格式化的快捷鍵
  2. npm install typescript@2.9.2 -g
    npm install ts-node@7.0.0 -g
    記下ts-node可執(zhí)行文件路徑
    image.png
  3. 配置文件(.vscode/launch.json)
{
     "configurations": [
         {
         "name": "ts-node",
         "type": "node",
         "request": "launch",
         "program": "這里寫(xiě)之前ts-node的安裝路徑",
         "args": ["${relativeFile}"],
         "cwd": "${workspaceRoot}",
         "protocol": "inspector"
         }
     ]
 }

2. ts文檔

1. 第一步

創(chuàng)建greeter.ts文件早抠,按下保存的快捷鍵腌巾,再命令行進(jìn)入當(dāng)前文件夾運(yùn)行tsc greeter.ts杠袱,這樣就轉(zhuǎn)成js文件

function greeter(person: string) {
    return "Hello, " + person;
}

let user = "Jane User"; 

console.log(greeter(user));  
// 若傳的不是string會(huì)報(bào)錯(cuò),但undefined可以通過(guò)

2. 接口

interface可以讓你規(guī)定一個(gè)對(duì)象必須要有哪些屬性智绸,同時(shí)在函數(shù)傳的參數(shù)里也只能用這些屬性

interface Person {
    firstName: string;
    lastName: string;
}

function greeter(person: Person) {
    return "Hello, " + person.firstName + " " + person.lastName;
}

let user = { firstName: "Jane", lastName: "User" };

console.log(greeter(user));

3. 類

類可以支持函數(shù)

class Student {
    fullName: string;
    firstName: string;
    constructor(firstName: string, public middleInitial: string, public lastName: string) {
        this.firstName = firstName
        this.fullName = firstName + " " + middleInitial + " " + lastName;
    }
}

interface Person {
    firstName: string;
    lastName: string;
}

function greeter(person : Person) {
    return "Hello, " + person.firstName + " " + person.lastName;
}

let user = new Student("Jane", "M.", "User");

console.log(greeter(user));

public等于幫你申明一個(gè)變量并在constructor里寫(xiě)上this.lastName = lastName野揪,所以Student有四個(gè)屬性:fullName、firstName瞧栗、middleInitial囱挑、lastName,但在函數(shù)greeter里只能用接口里有的屬性沼溜,不能用fullName,除非你接口用Student

3. 實(shí)現(xiàn)一些簡(jiǎn)單函數(shù)

1. 找較小數(shù)

function min(a: number,b: number): number{
    if(a>b){
        return b
    }else{
        return a
    }
}
console.log(min(2,1))

意思是返回值也必須是number

2. 重載

function add(a: string, b: string): string;
function add(a: number, b: number): number;
function add(a: any, b: any): any {
    return a+b
}
console.log(add('a','d'));

a和b只支持同時(shí)是string或者同時(shí)是number類型

3. 定義數(shù)組的方式

  • 第一種
let a: number[] = [1,2,3]; // 意思是由number組成的數(shù)組
  • 第二種
let b: Array<number> = [1,2,3]  

3. 元祖

已知元素?cái)?shù)量和類型情況下的數(shù)組可以用元祖

let x: [string, number];
// Initialize it
x = ['hello', 10]; // OK
// Initialize it incorrectly
x = [10, 'hello']; // Error

3. 判斷是否能結(jié)婚

interface human{
    gender: string;
}
function merry(a: human,b :human): [human, human]{
    if(a.gender !== b.gender){
        return [a,b]
    } else{
        throw new Error('性別相同不能結(jié)婚')
    }
}
let a = {gender: 'male'}
let b = {gender: 'female'}

console.log(merry(b,b));
  • 枚舉
    給性別規(guī)定只能是male和female
enum Gender {
    Male,
    Female
}

interface human{
    gender: Gender;
}
function merry(a: human,b :human): [human, human]{
    if(a.gender !== b.gender){
        return [a,b]
    } else{
        throw new Error('性別相同不能結(jié)婚')
    }
}
let a = {gender: Gender.Male}
let b = {gender: Gender.Female}

console.log(merry(a,b));

4. 實(shí)現(xiàn)一些命令行工具

1. process.argv

在1.ts文件里寫(xiě)

#!/usr/bin/env ts-node  // 蛇棒
console.log(process.argv)  
// 在命令行里運(yùn)行`./1.ts abc`游添,process.argv 就是這一行的內(nèi)容
console.log(123);

第一行加了蛇棒系草,在命令行運(yùn)行node ./1.ts的時(shí)候就不用加node,直接運(yùn)行./1.ts即可
運(yùn)行npm init -y唆涝,在目錄里添加package.json文件
運(yùn)行npm i -D @types/node找都,安裝process的包

2. 加法

給ts加es6的語(yǔ)法庫(kù),在目錄下創(chuàng)建tsconfig.json文件廊酣,去網(wǎng)上復(fù)制tsconfig.json的默認(rèn)格式能耻,然后在里面添加"es2015"

// tsconfig.json
{
    "compilerOptions": {
        "lib": [
            "es2015"
        ]
    }
}
  • add.ts
#!/usr/bin/env ts-node

let a: number = parseInt(process.argv[2])
let b: number = parseInt(process.argv[3])
if(Number.isNaN(a) || Number.isNaN(b)){
    console.log('必須是數(shù)字')
} else {
    console.log(a+b)
}

命令行運(yùn)行./add.ts 1 2

#!/usr/bin/env ts-node
{
  let a: number = parseInt(process.argv[2])
  let b: number = parseInt(process.argv[3])
  if(Number.isNaN(a) || Number.isNaN(b)){
    console.log('必須是數(shù)字')
    process.exit(1)
  }

  console.log(a+b)
  process.exit(0)
}

成功的退出返回0,不成功的返回1

3. 族譜

#!/usr/bin/env ts-node

{
    class Person{
        public Children: Person[] = [];
        constructor(public name: string){}
        addChild(child: Person): void {
            this.Children.push(child)
        }
        introduceFamily(n: number): void {
            let pre = '----'.repeat(n-1)
            console.log(pre + this.name)
            this.Children.forEach(child=>{
                child.introduceFamily(n+1)
            })
        }
    }

    let a = new Person('jpj')
    let b = new Person('son')
    let c = new Person('daughter')
    a.addChild(b)
    a.addChild(c)
    a.introduceFamily(1)
}

下面將n改為可選參數(shù)

#!/usr/bin/env ts-node

{
    function createPre(n: number): string {
        return '----'.repeat(n)
    }
    class Person{
        public Children: Person[] = [];
        constructor(public name: string){}
        addChild(child: Person): void {
            this.Children.push(child)
        }
        introduceFamily(n?: number): void {
            n = n || 1
            console.log(createPre(n-1) + this.name)
            this.Children.forEach(child=>{
                child.introduceFamily(n+1)
            })
        }
    }

    let a = new Person('jpj')
    let b = new Person('son')
    let c = new Person('daughter')
    a.addChild(b)
    a.addChild(c)
    a.introduceFamily(1)
}

在n后加個(gè)?亡驰,就變?yōu)榭蛇x參數(shù)

5. 模版字符串

let name: string = `Gene`;
let age: number = 37;
let sentence: string = `Hello, my name is ${ name }.

6. 枚舉

enum Color {Red, Green, Blue}
let c: Color = Color.Green;

enum Color {Red = 0, Green, Blue}
let colorName: string = Color[2];

console.log(colorName);  // 顯示'Blue'

7. any

// 前面不加any晓猛,這樣用編譯時(shí)就會(huì)報(bào)錯(cuò)
let notSure = 412312;
console.log(notSure.substr())

// 加個(gè)any就會(huì)在執(zhí)行時(shí)報(bào)錯(cuò)
let notSure: any = 412312;
console.log(notSure.substr())

// 在不知道數(shù)組類型時(shí)也可以用any
let list: any[] = [1, true, "free"];
list[1] = 100;

8. void

// void表示沒(méi)有任何類型。 當(dāng)一個(gè)函數(shù)沒(méi)有返回值時(shí)凡辱,你通常會(huì)見(jiàn)到其返回值類型是 `void`:
function warnUser(): void {
    alert("This is my warning message");
}

// 聲明一個(gè)void類型的變量沒(méi)有什么大用戒职,因?yàn)槟阒荒転樗x予undefined和null:
let unusable: void = undefined;

9. 可選屬性

加了?疑問(wèn)號(hào)之后,就變?yōu)榭蛇x屬性透乾,如果不加疑問(wèn)號(hào)的話在寫(xiě)createSquare的參數(shù)的時(shí)候就必須同時(shí)傳color和width

interface SquareConfig {
  color?: string;
  width?: number;
}

function createSquare(config: SquareConfig): {color: string; area: number} {
  let newSquare = {color: "white", area: 100};
  if (config.color) {
    newSquare.color = config.color;
  }
  if (config.width) {
    newSquare.area = config.width * config.width;
  }
  return newSquare;
}

let mySquare = createSquare({color: "black"});

10. 接口

1. 只讀屬性

interface Point {
    readonly x: number;
    readonly y: number;
}
let p1: Point = { x: 10, y: 20 };
p1.x = 5; // error!
// 賦值
  • 還有只讀的數(shù)組
let a: number[] = [1, 2, 3, 4];
let ro: ReadonlyArray<number> = a;
ro[0] = 12; // error!
ro.push(5); // error!
ro.length = 100; // error!
a = ro; // error!

賦新值也不行洪燥,除非用類型斷言重寫(xiě)

a = ro as number[];

做為變量使用的話用 const磕秤,若做為屬性則使用readonly。

2. 額外的屬性檢查

如果你能夠確定這個(gè)對(duì)象可能具有某些做為特殊用途使用的額外屬性

interface SquareConfig {
    color?: string;
    width?: number;
    [propName: string]: any;
}

3. 接口也可以定義函數(shù)

interface SearchFunc {
  (source: string, subString: string): boolean;
}

// 函數(shù)的參數(shù)名不需要與接口里定義的名字相匹配
let mySearch: SearchFunc =  function(src: string, sub: string): boolean {
  let result = src.search(sub);
  return result > -1;
}

11. 函數(shù)

let myAdd: (baseValue: number, increment: number) => number =
    function(x: number, y: number): number { return x + y; 
};

函數(shù)也不會(huì)固定參數(shù)的名字捧韵,只要類型匹配就可以

  • 剩余參數(shù)
    在你不確定參數(shù)個(gè)數(shù)時(shí)
function buildName(firstName: string, ...restOfName: string[]) {
    return firstName + " " + restOfName.join(" ");
}

let employeeName = buildName("Joseph", "Samuel", "Lucas", "MacKinzie");
console.log(employeeName);

12. 泛型

一個(gè)函數(shù)想讓傳入?yún)?shù)類型和return類型相同時(shí)市咆,可以用泛型

function identity<T>(arg: T): T {
    console.log(T.length)  // 報(bào)錯(cuò)
    return arg;
}

這樣你傳的是什么類型,輸出就必須是什么類型

function loggingIdentity<T>(arg: T[]): T[] {
    console.log(arg.length);  // 這樣就不會(huì)報(bào)錯(cuò)
    return arg;
}

13. 聲明合并

1. 合并接口

interface Box {
    height: number;
    width: number;
}

interface Box {
    scale: number;
}

let box: Box = {height: 5, width: 6, scale: 10};

13. 類型兼容性

1. 函數(shù)

let x = (a: number) => 0;
let y = (b: number, s: string) => 0;

y = x; // OK再来,可以把x賦給y
x = y; // Error蒙兰,不能把y賦給x
console.log(x(123123))
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市其弊,隨后出現(xiàn)的幾起案子癞己,更是在濱河造成了極大的恐慌,老刑警劉巖梭伐,帶你破解...
    沈念sama閱讀 221,695評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件痹雅,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡糊识,警方通過(guò)查閱死者的電腦和手機(jī)绩社,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)赂苗,“玉大人愉耙,你說(shuō)我怎么就攤上這事“枳蹋” “怎么了朴沿?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,130評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)败砂。 經(jīng)常有香客問(wèn)我赌渣,道長(zhǎng),這世上最難降的妖魔是什么昌犹? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,648評(píng)論 1 297
  • 正文 為了忘掉前任坚芜,我火速辦了婚禮,結(jié)果婚禮上斜姥,老公的妹妹穿的比我還像新娘鸿竖。我一直安慰自己,他們只是感情好铸敏,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,655評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布缚忧。 她就那樣靜靜地躺著,像睡著了一般搞坝。 火紅的嫁衣襯著肌膚如雪搔谴。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 52,268評(píng)論 1 309
  • 那天桩撮,我揣著相機(jī)與錄音敦第,去河邊找鬼峰弹。 笑死,一個(gè)胖子當(dāng)著我的面吹牛芜果,可吹牛的內(nèi)容都是我干的鞠呈。 我是一名探鬼主播,決...
    沈念sama閱讀 40,835評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼右钾,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼蚁吝!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起舀射,我...
    開(kāi)封第一講書(shū)人閱讀 39,740評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤窘茁,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后脆烟,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體山林,經(jīng)...
    沈念sama閱讀 46,286評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,375評(píng)論 3 340
  • 正文 我和宋清朗相戀三年邢羔,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了驼抹。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,505評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡拜鹤,死狀恐怖框冀,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情敏簿,我是刑警寧澤明也,帶...
    沈念sama閱讀 36,185評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站惯裕,受9級(jí)特大地震影響诡右,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜轻猖,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,873評(píng)論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望域那。 院中可真熱鬧咙边,春花似錦、人聲如沸次员。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,357評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)淑蔚。三九已至市殷,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間刹衫,已是汗流浹背醋寝。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,466評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工搞挣, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人音羞。 一個(gè)月前我還...
    沈念sama閱讀 48,921評(píng)論 3 376
  • 正文 我出身青樓囱桨,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親嗅绰。 傳聞我的和親對(duì)象是個(gè)殘疾皇子舍肠,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,515評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容