typescript

TS開發(fā)環(huán)境搭建

1.下載node.js
2.安裝node.js
3.使用npm全局安裝typescript

  • 進(jìn)入命令行
  • 輸入: npm install -g typescript
    4.創(chuàng)建一個ts文件 xxx.ts
    5.使用tsc對ts文件進(jìn)行編譯
  • 進(jìn)入命令行
  • 進(jìn)入ts文件所在目錄
  • 執(zhí)行命令: tsc xxx.ts

TS的類型聲明

console.log('hello Ts')
// TS的類型聲明
let n: number;
n = 1
let a: string = '1';
let b = false  //如果變量的聲明和賦值同時進(jìn)行死陆,TS是可以自動對變量進(jìn)行類型檢測
image.png
console.log('hello Ts')
// TS的類型聲明
let n: number;
n = 1
let a: string = '1';
let b = false  //如果變量的聲明和賦值同時進(jìn)行昼接,TS是可以自動對變量進(jìn)行類型檢測


//也可以直接使用字面量進(jìn)行類型聲明
let c: 10

//可以使用 | 來連接多個類型( 聯(lián)合類型 )
let d : boolean | string
d = 'd'
d = false
//object表示一個js對象
let o :object;
o={}
o=function(){}

//{}用來指定對象中可以包含哪些屬性
//語法:{屬性名:屬性值版仔,屬性名,屬性值}
//在屬性名后面加上阀湿?,表示屬性是可選的

let o2 :{name:string, age?:number}
o2={name:'ss',age:2}
//[propName:string]:any 表示任意類型的屬性
let o3 :{name:string,[propName:string]:any}
o3={name:'ss',age:12,gender:'男'}

//設(shè)置函數(shù)結(jié)構(gòu)的類型聲明:
//語法: (形參:類型, 形參:類型...) => 返回值
let o4 :(a:number,b:number) => number
o4 = function(n1,n2){
    return n1+n2
}

//數(shù)組的類型聲明:  類型[] Array<類型>
//string[]表示字符串?dāng)?shù)組
let e: string[]
e = ['a','b']
//number[]表示數(shù)值數(shù)組
let f: Array<number>
f=[1,2,3]

//元組,就說固定長度的數(shù)組
//語法:[類型,類型,類型]
let g:[string,string,number]
g = ['hello','abc',2]

//枚舉  enum
enum Gender{
    male = 0,
    female = 1

}
let i :{name:string,gender:Gender}
i = {
    name:'ss',
    gender:Gender.male
}
console.log(i.gender = Gender.male)

TS編譯選項

  • 自動編譯文件
    編譯文件時,使用 -w指令后吆视,TS編譯器會自動監(jiān)視文件的變化典挑,并在文件發(fā)生變化時對文件進(jìn)行重新編譯
    tsc app.ts -w
  • 自動編譯整個項目
    如果直接使用tsc指令,則可以自動將當(dāng)前項目下的所有ts文件編譯為js文件
    但是能直接使用tsc命令的前提是 要先在項目根目錄下創(chuàng)建一個ts的配置文件 tsconfig.json
    tsconfig.json是一個JSON文件啦吧,添加配置文件后搔弄,只需tsc命令即可完成對整個項目的編譯

tsc 編譯所有ts文件,需要配置tsconfig.json文件
tsc -w 監(jiān)視所有文件的變化并重新編譯

  • 配置選項
    1. include 定義希望被編譯文件所在的目錄
    2. exclude 定義需要排除在外的目錄
    3. extends 定義被繼承的配置文件
"extends":"./configs/base"
  1. files 指定被編譯文件的列表,只有需要編譯的文件少時才會用到
  2. compilerOptions 編譯器的選項
{
    /* 
    tsconfig.json 是ts編譯器的配置文件丰滑,ts編譯器可以根據(jù)它的信息來對代碼進(jìn)行編譯
    "include" 用來指定哪些ts文件需要被編譯
        路徑: **  表示任意目錄
                * 表示任意文件
    "exclude" 不需要被編譯的工作路徑
        默認(rèn)值:["node_modules","bower_components","jspm_packages"]
    */
    "include":[
        "./src/**/*"
    ],
    "exclude": [
        "./src/js/**/*"
    ],
    /*
        compilerOptions  編譯器的選項
    */
    "compilerOptions":{
        //target 用來指定ts被編譯為的ES的版本
        //'es5', 'es6', 'es2015', 'es2016', 'es2017', 'es2018', 'es2019', 'es2020', 'es2021', 'es2022', 'esnext'
        "target": "ES6",
        //module 指定要使用的模塊化的范圍
        // 'none', 'commonjs', 'amd', 'system', 'umd', 'es6', 'es2015', 'es2020', 'es2022', 'esnext', 'node16', 'nodenext', 'preserve'.
        "module": "System",
        //lib用來指定項目中要使用的庫
        // "lib":[]
        //outDir 用來指定編譯后文件所在的目錄
        "outDir": "./dist",

        //將代碼合并為一個文件
        //設(shè)置outFile后,所有的全局作用域中的代碼會合并到同一個文件中
        // "outFile": "./dist/app.js",

//是否對js文件進(jìn)行編譯倒庵,默認(rèn)是false
        "allowJs": false,
        //檢查js代碼是否符合語法規(guī)范褒墨,默認(rèn)是false
        "checkJs": false,
        //是否移除注釋
        "removeComments": false,
        //不生成編譯后的文件
        "noEmit": false,
        //當(dāng)有錯誤時不生成編譯后的文件
        "noEmitOnError": false,

        //所有嚴(yán)格檢查的總開關(guān)
        "strict": false,
        
        //用來設(shè)置編譯后的文件是否使用嚴(yán)格模式,默認(rèn)false
        "alwaysStrict": false,
        //不允許隱式的any類型
        "noImplicitAny": false,
        //不允許不明確類型的this
        "noImplicitThis": false,
        //嚴(yán)格的檢查空值
        "strictNullChecks": false,
    }
}

使用webpace打包ts代碼

1.初始化項目擎宝,通過命令生成package.json
npm init -y
2.下載構(gòu)建工具
npm i -D webpack webpack-cli typescript ts-loader
3.創(chuàng)建webpack.config.json

//引入一個包
const path = require('path')

//webpack中的所有配置信息都應(yīng)該寫在module.exports中
module.exports = {
    //指定入口文件
    entry: "./src/index.ts",

    //指定打包文件所在目錄
    output: {
        path: path.resolve(__dirname,'dist'),
        filename: "bundle.js"
    },
    module: {
        //指定要加載的規(guī)則
        rules: [
            {
                //test指定的是規(guī)則生效的文件
                test:  /\.ts$/,
                //要是有的loader
                use: 'ts-loader',
                //要排除的文件
                exclude: /node-modules/

            }
        ]
    }

}

4.創(chuàng)建tsconfig.json

{
    "compilerOptions": {
        "module": "ES2015",
        "target": "ES2015",
        "strict": true
    }
}

5.package.json里添加 "build":"webpack"

  1. npm run build 進(jìn)行打包
    如果想要index.html也自動生成郁妈,安裝html-webpack-plugin插件,
webpack.config.js
const HtmlWebpackPlugin = require('html-webpack-plugin')

//module下配置
//配置webpack插件
    plugins: [
        new HtmlWebpackPlugin({
            // title:'這是一個自定義title',
            template:'./src/index.html'
        })
    ]

7.網(wǎng)頁瀏覽
webpack-dev-server 安裝內(nèi)置服務(wù)器
配置命令
"start": "webpack serve --open"
執(zhí)行npm start 可打開頁面

  1. 模塊化報錯配置
//用來設(shè)置引用模塊
    resolve: {
        extensions: ['.ts','.js']
    }
安裝babel

npm i -D @babel/core @babel/preset-env babel-loader core-js
改webpack.config.js

                use: [
                    //配置babel
                    {
                        //指定加載器
                        loader:"babel-loader",
                        //設(shè)置babel
                        options: {
                            //設(shè)置預(yù)定義的環(huán)境
                            presets: [
                                [
                                    //指定環(huán)境插件
                                    "@babel/preset-env",
                                    //配置信息
                                    {
                                        //要兼容的目標(biāo)瀏覽器
                                        targets: {
                                            "chrome":"58",
                                            'ie':"11"
                                        },
                                        //指定corejs的版本
                                        "corejs":"3",
                                        //使用corejs的方式 "usage" 表示按需加載
                                        "useBuiltIns": "usage"
                                    }
                                ]
                            ]
                        }
                    },
                    'ts-loader'
                ],
webpack打包后箭頭函數(shù)在ie下報錯绍申,解決辦法
    //指定打包文件所在目錄
    output: {
        //指定打包文件的目錄
        path: path.resolve(__dirname,'dist'),
        //打包后的文件
        filename: "bundle.js",
        //告訴webpack不使用箭頭函數(shù)
        environment: {
            arrowFunction: false
        }
    },

面向?qū)ο?/h2>

console.log('index')

class Person{
    name: string
    age: number
    constructor(name:string,age:number){
        this.name = name
        this.age = age
    }
    // 方法必須使用該語法噩咪,不能使用ES5的對象完整形式
    call(){
        console.log(this)
    }
}

let aaa = new Person('dsa',18)
aaa.call()
console.log(aaa)
以abstract開頭的類是抽象類

抽象類和其他類區(qū)別不大,只是不能用來創(chuàng)建對象
抽象類就是專門用來繼承的類

abstract class Animal {
  name: string
  constructor(name:string){
    this.name = name
  }

  //定義一個抽象方法
  //抽象方法使用abstract開頭极阅,沒有方法體
  //抽象方法只能定義在抽象類中胃碾,子類必須對抽象方法進(jìn)行重寫
  abstract sayHello():void
}
class Dog extends Animal {
  sayHello(){
    console.log("汪汪汪")
  }
}

接口

//接口就是用來定義一個類的結(jié)構(gòu),用來定義一個類中應(yīng)該包含哪些屬性和方法
    //同時接口也可以當(dāng)成類型聲明去使用
    interface myInterface {
        name: string
        age: number
    }
    const obj: myInterface = {
        name:'sss',
        age: 18
    }
    //接口可以在定義類的時候去限制類的結(jié)構(gòu)
    //接口中的所有屬性都不能有實際的值
    //接口只定義對象的結(jié)構(gòu)筋搏,而不考慮實際值
    //在接口中所有的方法都是抽象方法

    interface myInter{
        name: string
        sayHello():void
    }
    // 定義類時仆百,可以使類去實現(xiàn)一個接口,
        // 實現(xiàn)接口就是使類滿足接口的要求
    class myClass implements myInter{
        name:string
        constructor(name:string){
            this.name = name
        }
        sayHello(): void {
            console.log('大家好');
            
        }
    }

屬性的封裝

public 修飾的屬性可以在任意位置訪問(修改)默認(rèn)值
private 私有屬性奔脐,私有屬性只能在類內(nèi)部進(jìn)行訪問(修改)
protected 受保護(hù)的屬性俄周,只能在當(dāng)前類和當(dāng)前類的子類中訪問(修改)
getter方法用來讀取屬性
setter方法用來設(shè)置屬性
它們被稱為屬性的存取器

(function(){
    class Person {
        private _name:string
        private _age:number
        constructor(name:string,age:number){
            this._name = name
            this._age = age
        }
        //定義方法獲取name屬性
        getName(){
            return this._name
        }
        //定義方法,用來設(shè)置name屬性
        setName(value:string){
            this._name = value
        }

        //TS中設(shè)置getter方法的方式
        get age(){
            return this._age
        }
        set age(value:number){
            if(value >0){
                this._age = value
            }
        }
    }

    
    const per = new Person('孫武了',18)
    per.setName('豬八戒')
    console.log(per.getName())
    per.age = 30
    console.log(per.age)

class C{
        constructor(public name:string,public age:number){
            this.name = name
            this.age = age
        }
    }
    const c = new C('xxx',18)
    console.log(c)
})()

泛型

在定義函數(shù)或類時髓迎,如果遇到類型不明確就可以使用泛型

    function fn<T>(a:T):T{
        return a
    }
//可以直接調(diào)用具有泛型的函數(shù)
fn(10) //不指定泛型峦朗,TS可以自動對類型進(jìn)行推斷
fn<string>('hello') //指定泛型

案例

安裝less
npm安裝

npm i -D less less-loader css-loader style-loader

webpack.config.json中配置

module: {
  rules: [
       //設(shè)置less文件的處理
            {
                test: /\.less$/,
                use:[
                    "style-loader",
                    "css-loader",
                    "less-loader"
                ]
            }
  ]
}

babel 配置css兼容
npm i -D postcss postcss-loader postcss-preset-env

//設(shè)置less文件的處理
            {
                test: /\.less$/,
                use:[
                    "style-loader",
                    "css-loader",
                    //引入postcss
                    {
                        loader:"postcss-loader",
                        options: {
                            postcssOptions: {
                                plugins: [
                                    [
                                       "postcss-preset-env",
                                       {
                                        browsers:"last 2 versions"
                                       } 
                                    ]
                                ]
                            }
                        }
                    },
                    "less-loader"
                ]
            }
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市排龄,隨后出現(xiàn)的幾起案子波势,更是在濱河造成了極大的恐慌,老刑警劉巖涣雕,帶你破解...
    沈念sama閱讀 221,635評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件艰亮,死亡現(xiàn)場離奇詭異,居然都是意外死亡挣郭,警方通過查閱死者的電腦和手機(jī)迄埃,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來兑障,“玉大人侄非,你說我怎么就攤上這事蕉汪。” “怎么了逞怨?”我有些...
    開封第一講書人閱讀 168,083評論 0 360
  • 文/不壞的土叔 我叫張陵者疤,是天一觀的道長。 經(jīng)常有香客問我叠赦,道長驹马,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,640評論 1 296
  • 正文 為了忘掉前任除秀,我火速辦了婚禮糯累,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘册踩。我一直安慰自己泳姐,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 68,640評論 6 397
  • 文/花漫 我一把揭開白布暂吉。 她就那樣靜靜地躺著胖秒,像睡著了一般。 火紅的嫁衣襯著肌膚如雪慕的。 梳的紋絲不亂的頭發(fā)上阎肝,一...
    開封第一講書人閱讀 52,262評論 1 308
  • 那天,我揣著相機(jī)與錄音肮街,去河邊找鬼盗痒。 笑死,一個胖子當(dāng)著我的面吹牛低散,可吹牛的內(nèi)容都是我干的俯邓。 我是一名探鬼主播,決...
    沈念sama閱讀 40,833評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼熔号,長吁一口氣:“原來是場噩夢啊……” “哼稽鞭!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起引镊,我...
    開封第一講書人閱讀 39,736評論 0 276
  • 序言:老撾萬榮一對情侶失蹤朦蕴,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后弟头,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體吩抓,經(jīng)...
    沈念sama閱讀 46,280評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,369評論 3 340
  • 正文 我和宋清朗相戀三年赴恨,在試婚紗的時候發(fā)現(xiàn)自己被綠了疹娶。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,503評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡伦连,死狀恐怖雨饺,靈堂內(nèi)的尸體忽然破棺而出钳垮,到底是詐尸還是另有隱情,我是刑警寧澤额港,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布饺窿,位于F島的核電站,受9級特大地震影響移斩,放射性物質(zhì)發(fā)生泄漏肚医。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,870評論 3 333
  • 文/蒙蒙 一向瓷、第九天 我趴在偏房一處隱蔽的房頂上張望忍宋。 院中可真熱鬧,春花似錦风罩、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至哺徊,卻和暖如春室琢,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背落追。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評論 1 272
  • 我被黑心中介騙來泰國打工盈滴, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人轿钠。 一個月前我還...
    沈念sama閱讀 48,909評論 3 376
  • 正文 我出身青樓巢钓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親疗垛。 傳聞我的和親對象是個殘疾皇子症汹,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,512評論 2 359

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