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會生成對應的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ō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)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,517評論 6 539
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,087評論 3 423
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,521評論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,493評論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,207評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,603評論 1 325
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,624評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,813評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,364評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 41,110評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,305評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,874評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,532評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,953評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,209評論 1 291
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,033評論 3 396
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,268評論 2 375