@芥末的糖-----TypeScript學(xué)習(xí)

image

女友御用版TS解析

優(yōu)勢:

-增加了代碼的可閱讀和可維護(hù)性

安裝:

  npm install -g typescript

一.基礎(chǔ)類型

布爾值

let isDone: boolean = false;

數(shù)字 number

let number: number = 6; 
let notANumber: number = NaN;

字符串

 let  string: string = 'Tom';

空值 void

  • void 類型的變量只能賦值為 undefined 和 null
    let unusable: void = undefined;
  • 可以用 void 表示沒有任何返回值的函數(shù)
function myname():void{
}

null 和 undefined

  • undefined 類型的變量只能被賦值為 undefined藐俺,null 類型的變量只能被賦值為 null
let u: undefined = undefined;
let n: null = null;

與 void 的區(qū)別是,undefined 和 null 是所有類型的子類型欲芹。也就是說 undefined 類型的變量,可以賦值給 number 類型的變量:

let u: undefined;
let num: number = u;
let num2:number = undefined;
// 編譯合法 undefined是number的子類型

let unm2: void;
let num3: number = unm2;
// => 不合法 (void不是number的子類型)

任意值 any

let anyType:any = 'seven';
anyType = 7;

變量如果在聲明的時候颈娜,未指定其類型滞伟, 也沒有賦值, 那么它會被推斷(類型推論)為任意值類型而完全不被類型檢查

let something; 
// 等價(jià)于 let something: any;
something = 'seven';
something = 7;

二.數(shù)組

1野崇,類型 + 方括號( type [ ] )
這種方式定義的數(shù)組項(xiàng)中不允許出現(xiàn)其他的類型

    let list: number[] = [1, 2, 3];

2亩钟,數(shù)組泛型 Array < type >

    let list: Array<number> = [1, 2, 3];

三.元祖

簡單理解為可定義一組不同類型的數(shù)據(jù):

let arr:[string, number] = ['name', 20];
console.log(arr[0]); 
// => 'name' 

越界元素:當(dāng)訪問超出元祖長度的元素時鳖轰,它的類型會被限制為元祖中每個類型的聯(lián)合類型

let arr:[string, number] = ['name', 20];
arr[0] = 'age';
arr[2] = 'string';
arr[3] = 40;
arr[4] = true; // 編譯報(bào)錯

四.枚舉 enum

被限定在一定范圍內(nèi)的場景扶镀,如一周只有7天,一年只有4季等

  • 數(shù)字枚舉
enum Weeks {Mon, Tue, Wed, Thu, Fri, Sat, Sun};
  • 字符串枚舉
enum Direction {
    Up = "UP",
    Down = "DOWN",
    Left = "LEFT",
    Right = "RIGHT",
}

常量枚舉在編譯階段是會被刪除的

五.類型推論

變量申明如果沒有明確的指定類型昆雀,那么 TypeScript 會依照類型推論的規(guī)則推斷出一個類型

let string = 'seven'; 
// 等價(jià)于 let string: string = 'seven'; 
string = 4; 
// 編譯報(bào)錯: error TS2322: Type 'number' is not assignable to type 'string' 

變量聲明但是未賦值蝠筑,會推論為 any

let x;
x = 1;
x = 'aaa'

六.聯(lián)合類型

let stringOrNumber:string | number;
stringOrNumber = 'seven';

七.類型斷言

實(shí)則類似instanceof,來斷定一個類型

let someValue: any = "this is a string";
let strLength: number = (<string>someValue).length;

八.自定義類型

//  類型別名用法 自定義自己類型 public private等
type myType = {
    name: string,
    age: number,
}

接口 Interfaces

必須一一對應(yīng)key和value

// 定義一個接口 Person
interface Person {
  name: string;
  age: number;
}

// 定義一個個變量什乙,它的類型是 Person
let tom: Person = {
  name: 'Tom',
  age: 25
};

可選屬性

interface Person {
  name: string;
  age?: number;
}
let tom: Person = {
  name: 'tom'
}
// age是可選屬性

任意屬性(定義之后,person03所有的value只都必須為any)

interface Person03 {
  name: string;
  age?: number;
  [propName: string]: any;
}
let tom04: Person03 = {
  name: 'Tom',
  age: 25,
  gender: 'male'
};

只讀屬性readonly(一次給對象賦值可以辅愿,但是不能修改)

interface Person {
  readonly id: number;
}

let person: Person = {
  id: 100,
}
person.id = 2//報(bào)錯

函數(shù)

用接口定義函數(shù)的形狀

interface FuncAdd {
  (value: number, increment: number): number
}
let add: FuncAdd;
add = function(value: number, increment: number): number {
  return value + increment;
}
// 函數(shù)的參數(shù)名不需要與接口里定義的名字相匹配
let add2: FuncAdd;
add2 = function(a: number, b: number) {
  return a + b;
}

可選參數(shù)(必須放在參數(shù)的最后面)

function addNum(a: number, b: number, c? :number): number {
    if(c) {
        return a + b + c;
    } else {
        return a + b;
    }
}
console.log(add(1, 2));

默認(rèn)參數(shù)

function add(a: number = 1, b: number): number {
    return a + b;
}
console.log(add(undefined, 1))

類 class

類的定義

class Animal {
        name:string; // 定義屬性
    constructor(name) {
        this.name = name; // 屬性賦值
    }
    sayHi() {
        return `我叫 ${this.name}`;
    }
}

let cat = new Animal('Tom');
console.log(cat.sayHi()); // 我叫 Tom

類的繼承

class Cat extends Animal {
    color: string;
    constructor(name, color) {
        super(name); // 調(diào)用父類Animal的 constructor(name)
        this.color = color
    }
    sayHi() {
        // 調(diào)用父類的 sayHi()忆某;
        return super.sayHi() + '我是一只'+ this.color + ' 色的貓,'; 
    }
}

let c = new Cat('Tom', '橘黃'); // Tom
console.log(c.sayHi()); // 我叫 Tom亦鳞,我是一只橘黃色的貓棒坏;

let cat2 = new Cat('Jerry');
cat2.color = '黑';
console.log(c.sayHi()); // 我叫 Jerry,我是一只黑色的貓徒探;

存取器

class Animal {
        name:string;
    constructor(name) {
        this.name = name;
    }
    get name() {
        return 'Jack';
    }
    set name(value) {
        console.log('setter: ' + value);
    }
}

let a = new Animal('Kitty'); // setter: Kitty
a.name = 'Tom'; // setter: Tom
console.log(a.name); // Jack

靜態(tài)屬性和方法

  • static--子類不繼承
    -public--公共方法
    -private--私有
    -protected--繼承的子類可以訪問

多態(tài)

子類同種父類的方法名字

class Person {
  eat(){ console.log('eat') }
}
class A extends Person {
  eat(){ console.log('A eat') }
}
class B extends Person {
  eat(){ console.log('B eat') }
}

泛型函數(shù)

// 打印字符串
function printer1(arr:string[]):void {
for(var item of arr) {
  console.log(item)
}
}
printer1(['a','b','c','d'])
--------------------------------------------------------------------

function printer<T>(arr:T[]):void {
for(var item of arr) {
  console.log(item)
}
}
// 指定具體類型調(diào)用
printer<string>(['a','b','c','d']);
// 調(diào)用時也可以直接讓ts自己做類型推論
printer([1,2,3,4]);

聲明文件 declare

當(dāng)使用第三方庫時喂窟,我們需要引用它的聲明文件,才能獲得對應(yīng)的代碼補(bǔ)全碗啄、接口提示等功能

后續(xù)為實(shí)戰(zhàn),未完待續(xù)......我太難了啊

//傳給函數(shù)稳摄,用來解構(gòu)賦值
class a {
 aa({a,b}:{a:number,b:string}):void{
        console.log(11)
    }
}
let b = new a()
b.aa({
    a:1,
    b:"1"
})

工作中用到的

//基本數(shù)據(jù)類型--------------------------------------
private  str:string = ''
//數(shù)組(三種,我們用兩種)
//1
private  arr: string[] = ['1','2']
//2
private Array<string> = ['1','2']

//對象---------------------------

//允許接口里有任意屬性胆描。但是是所有子集的父級
//1(一般任意用了 就不寫別的了)
interface test{
  name: string;
  age?: number;
  [propName: string]: any;
}

//2
interface obj{
  name: string; // 表示對象要有name屬性, 值是string類型
  age?: number; // ? 表示age屬性可以有也可以沒有, 值是number類型
  readonly id: number; // readonly 表示 id 屬性只可讀,不可修改
}
let obj2: obj= { name: "obj2", age: 18, id: 2 };

//數(shù)組對象


interface test{
    name1: string;
}
interface zz{
    name: test;
}
const aaa:zz[] = [{name:{name1:"2"}}]


//函數(shù)
//1
function fn(x:number,y?: number,z:number = 1):void{}
//2

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末国夜,一起剝皮案震驚了整個濱河市短绸,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌醋闭,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,858評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異瑟曲,居然都是意外死亡豪治,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評論 3 395
  • 文/潘曉璐 我一進(jìn)店門烦衣,熙熙樓的掌柜王于貴愁眉苦臉地迎上來掩浙,“玉大人,你說我怎么就攤上這事厨姚。” “怎么了谬墙?”我有些...
    開封第一講書人閱讀 165,282評論 0 356
  • 文/不壞的土叔 我叫張陵拭抬,是天一觀的道長。 經(jīng)常有香客問我造虎,道長,這世上最難降的妖魔是什么贬派? 我笑而不...
    開封第一講書人閱讀 58,842評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮波桩,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘镐躲。我一直安慰自己侍筛,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,857評論 6 392
  • 文/花漫 我一把揭開白布裆熙。 她就那樣靜靜地躺著禽笑,像睡著了一般。 火紅的嫁衣襯著肌膚如雪佳镜。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,679評論 1 305
  • 那天蚀同,我揣著相機(jī)與錄音啊掏,去河邊找鬼。 笑死迟蜜,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的芦疏。 我是一名探鬼主播,決...
    沈念sama閱讀 40,406評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼酸茴,長吁一口氣:“原來是場噩夢啊……” “哼兢交!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起酪穿,我...
    開封第一講書人閱讀 39,311評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎救赐,沒想到半個月后只磷,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,767評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡钮追,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年元媚,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片刊棕。...
    茶點(diǎn)故事閱讀 40,090評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡鞠绰,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蜈膨,到底是詐尸還是另有隱情牺荠,我是刑警寧澤,帶...
    沈念sama閱讀 35,785評論 5 346
  • 正文 年R本政府宣布灶壶,位于F島的核電站,受9級特大地震影響驰凛,放射性物質(zhì)發(fā)生泄漏担扑。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,420評論 3 331
  • 文/蒙蒙 一胚宦、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧枢劝,春花似錦、人聲如沸您旁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽昨悼。三九已至,卻和暖如春率触,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背葱蝗。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評論 1 271
  • 我被黑心中介騙來泰國打工两曼, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人悼凑。 一個月前我還...
    沈念sama閱讀 48,298評論 3 372
  • 正文 我出身青樓,卻偏偏與公主長得像渐夸,于是被迫代替她去往敵國和親渔欢。 傳聞我的和親對象是個殘疾皇子墓塌,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,033評論 2 355