ts基礎(chǔ)

ts的優(yōu)點:靜態(tài)編譯提示錯誤狐赡,強類型撞鹉,接口和繼承,是js的超集颖侄,需要編譯后執(zhí)行

編譯

1鸟雏、ts后綴建立文件后通過tsc進行指定文件的編譯,不帶任何輸入文件的情況下調(diào)用tsc览祖,編譯器會從當前目錄開始去查找tsconfig.json文件孝鹊,逐級向上搜索父目錄。
2展蒂、不帶任何輸入文件的情況下調(diào)用tsc又活,且使用命令行參數(shù)--project(或-p)指定一個包含tsconfig.json文件的目錄。
3锰悼、當命令行上指定了輸入文件時柳骄,tsconfig.json文件會被忽略。
4松捉、直接通過ts test.ts會生成對應(yīng)的js文件
5夹界、通過sudo npm install ts-node -g --save --unsafe-perm=true --allow-root安裝依賴 可通過ts-node test.ts直接執(zhí)行
6馆里、通過配置vscode實現(xiàn)執(zhí)行tsc --init 生成文件 tsconfig.json隘世,修改路徑和添加watch監(jiān)聽實現(xiàn)自動監(jiān)控ts文件生成js: https://www.cnblogs.com/liangyy/p/12436720.html

tsconfig.json配置文件

配置示例

{
    "extends": "./configs/base",
    "compilerOptions": {
        "module": "commonjs",
        "noImplicitAny": true,
        "removeComments": true,
        "preserveConstEnums": true,
        "sourceMap": true,
        "types" : ["node", "lodash", "express"],
        "typeRoots" : ["./typings"]
    },
    "files": [
        "core.ts",
        "sys.ts",
        "types.ts"
    ],
    "include": [
        "src/**/*"
    ],
    "exclude": [
        "node_modules",
        "**/*.spec.ts"
    ]
}
  • extends 拓展配置文件 引入的會覆蓋當前的源文件配置
  • 默認配置下會編譯當前目錄以及子目錄下的所有文件 排除可能是輸出文件 支持拓展名為ts tsx d.ts 當allowJs設(shè)置為true則包含js jsx拓展名
  • 當配置了files之后只會引入對應(yīng)的配置下的文件,優(yōu)先于exclude指定的排除文件
  • include和exclude指定匹配模式鸠踪,支持(匹配0+多個字符不包含目錄)? (匹配一個任意字符)*/ (遞歸匹配任意子目錄)
  • 默認所有可見的@types包都會在編譯時包含進來丙者,node_modules/@types文件夾下以及子文件下所有包都是可見的,當被置頂了typeRoots則只有被指定的包會被包含進來营密,指定了types則node_modules/@types下的這些包會被引入進來械媒,可以通過指定types:[]來禁用自動引入

基礎(chǔ)語法

1、number boolean string null undefined指定五種基本類型,void指定空值可以賦值為null undefined纷捞,反之void不可賦值給任何類型痢虹;any代表任意類型的值(類似不寫);類型推論主儡,當你定義變量的時候賦值奖唯,ts會根據(jù)你的賦值推出一個類型,不進行賦值則會默認為任意值糜值;聯(lián)合類型:通過|分隔多個類型丰捷,訪問屬性/方法時只能是共有的,當賦值后則會類型推斷
2寂汇、接口:通過interface關(guān)鍵字進行定義病往,?可選屬性、[propName: type] 自定義屬性(自定義屬性后骄瓣,其他屬性必須為自定義屬性的子類)停巷、readonly只讀屬性

  • 接口描述了ts種復雜的類型結(jié)構(gòu),接口繼承自類的時候繼承了它的成員但是沒有繼承實現(xiàn)榕栏,所以接口的功能只能由子類來實現(xiàn)叠穆。

3、數(shù)組類型number[]或者Array<number>臼膏;也可以通過接口定義(復雜)硼被,其他類數(shù)組類型有自己的類型定義如IArguments NodeList
4、函數(shù)有兩種定義方式渗磅,通過?進行可選參數(shù)定義嚷硫,只能寫在最后,如果是寫了默認值的參數(shù)始鱼,ts認為是可選參數(shù)仔掸,且無位置要求,通過解構(gòu)獲取剩余參數(shù)医清,也可進行定義
5起暮、斷言 as語法:只要A兼容B或者B兼容A,就可以互相斷言会烙,子類可以被斷言為一個父類负懦,父類斷言可以為子類,是因為子類包含父類的所有屬性柏腻,可以訪問到父類的內(nèi)容
6纸厉、聲明文件一種是放在源碼里,通過types指定文件目錄五嫂;一種是補充到type庫颗品,最后是自己實現(xiàn).d.ts文件
7肯尺、type指定類型別名,類型約束
8躯枢、元組则吟,賦值時需要匹配,可單獨賦值锄蹂,可越界為聯(lián)合類型
9逾滥、enum 枚舉類型可以手動覆蓋;可以包含計算值败匹,下一個加一寨昙; 常數(shù)枚舉類型不可計算,外部枚舉類型 declare
10掀亩、類:public private protected abstract舔哪,抽象類必須被子類實現(xiàn)
11垦搬、接口繼承類:ts中的類在聲明時同時創(chuàng)建了一個同名的類型渔肩,它包含了屬性和方法,沒有constructor和static屬性卫键,接口繼承時繼承了這部分類型炼七,類似繼承了類生成的實例

類 接口 函數(shù)的用法

1缆巧、類 跟es6中的類差不多,添加了修飾符:public protected private豌拙,以及readonly陕悬;如果是抽象類abstract則不能直接實例化,抽象類中的抽象屬性和方法必須被子類實現(xiàn)按傅,類和接口很像捉超,他們的區(qū)別在于:

  • 類通過class實現(xiàn),通過extends繼承被子類繼承唯绍;接口是通過interface定義拼岳,被類所實現(xiàn)
  • 類的方法可以自己實現(xiàn),抽象類子類必須實現(xiàn)况芒;接口則是一組規(guī)則的定義
  • 類通常是對一個類別的公共部分做抽象惜纸,有規(guī)律;接口只是抽象绝骚,可能并無關(guān)聯(lián)

2耐版、接口:接口中可以定義可選屬性,索引屬性皮壁,只讀屬性椭更;也支持定義函數(shù)以及構(gòu)造函數(shù)的類型

  • 函數(shù)重載 根據(jù)不同的參數(shù)個數(shù)指定不同的類型
  • this指向 由于運行時才能確定this指向哪审,在ts中可以進行手動的this指向

3蛾魄、泛型 通過T來代指當運行時才能確認的類型,難點在于結(jié)合keyof和T<k>使用
4、兼容 如A=B滴须,協(xié)變是B包含A舌狗,逆變是A包含B,雙向協(xié)變是沒有規(guī)則
對象扔水、函數(shù)返回值痛侍、類中采用的是協(xié)變
函數(shù)參數(shù)個數(shù)的兼容采用的是逆變
函數(shù)參數(shù)的兼容和泛型用的是雙向協(xié)變

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

let user = ["Jane User"];

// document.body.innerHTML = greeter();
let u: void
// let num: number = u
let anyThind: any = 'hello'
console.log(anyThind.myName)
let from: string|number
from.toString()
from.length
from = 'z'
from.length

interface Person {
    name: string
    age: number
}

let child:Person = {
   name: 'zz',
   age: 12
}
interface Person {
    readonly id:number
    name: string
    age?:number
    [propName: string]: string|number
}
let child1: Person = {
    id:1,
    name: 'z',
    class: 1
}
child1.id = 2
// 數(shù)組
let list: number[] = [1]
let list2: Array<number> = [2]
interface IList {
    [index:number]: number,
    length:number,
    callee: Function
}
function sum() {
    let args: IList = arguments
}

// 函數(shù)
function myName(x:number,y:number, ...items: any[]): number {
   return x+y  
}
let mySum: (x:number, y:number) => number = function(x:number, y:number):number {return x+y}
// 函數(shù)重載
function reverse(x:number): number
function reverse(x:string): string
function reverse(x: string|number): number| string {
    return x
}
// 斷言和聲明
interface Animal {
    name: string
}
interface Cat {
    name: string,
    voice: string
}
let animal:Animal = {
    name: 'tom'
}
// 斷言只需要有互相包含的關(guān)系
let bai = animal as Cat
// 賦值必須滿足前者兼容后者
let baige2:Cat = {
    name: 'baige',
    voice: 'miao'
}
let baige:Cat = animal //失敗
// 類型別名
type stringName = string
let names: stringName = 'owo'
// 類型約束
type EventNames = 'click' | 'scroll' | 'mousemove'
// 元組
let tom: [string, number]
tom[0]='first'
tom = ['second',0]
tom.push(3)
// 枚舉
enum Days {Sun, Mon, Tue, Wed, Thu, Fri, Sat}
// 類 
abstract class Animals {
    public name;
    public constructor(name) {
        this.name = name
    }
    public abstract voice()
}
class Cats extends Animals {
    public voice() {
        // 必須要實現(xiàn)抽象類的屬性
    }
}
let miao = new Cats('bai')
// 泛型 后置確定類型 可定義約束
function copyFields<T extends U, U>(target: T, source: U): T {
    for(let id in source) {
        target[id] = (<T>source)[id]
    }
    return target
}
let x = {a:1, b:2}
let y = {b:10}
copyFields(x, y)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市待德,隨后出現(xiàn)的幾起案子君丁,更是在濱河造成了極大的恐慌,老刑警劉巖将宪,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件绘闷,死亡現(xiàn)場離奇詭異,居然都是意外死亡较坛,警方通過查閱死者的電腦和手機印蔗,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來丑勤,“玉大人华嘹,你說我怎么就攤上這事》ň海” “怎么了除呵?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長爪喘。 經(jīng)常有香客問我颜曾,道長,這世上最難降的妖魔是什么秉剑? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任泛豪,我火速辦了婚禮,結(jié)果婚禮上侦鹏,老公的妹妹穿的比我還像新娘诡曙。我一直安慰自己,他們只是感情好略水,可當我...
    茶點故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布价卤。 她就那樣靜靜地躺著,像睡著了一般渊涝。 火紅的嫁衣襯著肌膚如雪慎璧。 梳的紋絲不亂的頭發(fā)上床嫌,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天,我揣著相機與錄音胸私,去河邊找鬼厌处。 笑死,一個胖子當著我的面吹牛岁疼,可吹牛的內(nèi)容都是我干的阔涉。 我是一名探鬼主播,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼捷绒,長吁一口氣:“原來是場噩夢啊……” “哼瑰排!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起暖侨,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤凶伙,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后它碎,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體函荣,經(jīng)...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年扳肛,在試婚紗的時候發(fā)現(xiàn)自己被綠了傻挂。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡挖息,死狀恐怖金拒,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情套腹,我是刑警寧澤绪抛,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布,位于F島的核電站电禀,受9級特大地震影響幢码,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜尖飞,卻給世界環(huán)境...
    茶點故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一症副、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧政基,春花似錦贞铣、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至荐健,卻和暖如春酱畅,著一層夾襖步出監(jiān)牢的瞬間琳袄,已是汗流浹背圣贸。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留用含,地道東北人啄骇。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像虽惭,于是被迫代替她去往敵國和親蛇尚。 傳聞我的和親對象是個殘疾皇子取劫,可洞房花燭夜當晚...
    茶點故事閱讀 42,762評論 2 345