国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

TypeScript

waruqi / 1281人閱讀

摘要:訪問(wèn)越界的元素,使用聯(lián)合類型替代。構(gòu)造函數(shù)不能聲明返回類型。在子類中運(yùn)行構(gòu)造函數(shù)式繼承實(shí)現(xiàn)對(duì)父類的構(gòu)造函數(shù)繼承。的核心原則之一是對(duì)值所具有的進(jìn)行類型檢查。外部模塊則稱之為模塊語(yǔ)法通過(guò)關(guān)鍵字,將模塊的方法屬性暴露出來(lái)。

介紹

TypeScript是JavaScript的超集,為JavaScript的生態(tài)增加了類型機(jī)制,并最終將代碼編譯為純粹的JavaScirpt代碼。

編譯

</>復(fù)制代碼

  1. 瀏覽器加載文件編譯

注意,編譯的TypeScript文件需要放在編譯文件之前

</>復(fù)制代碼

</>復(fù)制代碼

  1. 自動(dòng)化構(gòu)架工具

1:fis

fis插件:fis-parser-typescript

</>復(fù)制代碼

  1. var fis = require("fis3");
  2. var typescirpt = require("fis3-parser-typescript");
  3. fis.match("**.ts", {
  4. parser: fis.plugin("typescript"),
  5. rExt: ".js"
  6. });

2: gulp
使用gulp插件:gulp-typescript

</>復(fù)制代碼

  1. var gulp = require("gulp");
  2. var ts = require("gulp-typescript");
  3. gulp.task("compileTs", function () {
  4. gulp.src("**.ts")
  5. .pipe(ts())
  6. .pipe(gulp.dest("dist"));
  7. });
  8. gulp.task("default", ["compileTs"]);
基礎(chǔ)類型

typescript囊括了所有JavaScript基本類型

基本類型

number 數(shù)字類型

string 字符串類型

boolean 布爾類型

any 任意一種

數(shù)組

定義數(shù)組
兩部分:前面一部分表示數(shù)組成員的類型,后面一部分表示告知是一個(gè)數(shù)組。

</>復(fù)制代碼

  1. let arr:number[] = [12, 23];
  2. let colors:any[] = [12, "cyan", "pink"]; // 數(shù)組任意類型
  3. let list:Array = [1, 2, 3]; // 數(shù)組泛型
元組

Tuple
元組類型允許表示一個(gè)已知元素?cái)?shù)據(jù)和類型的數(shù)組,各元素的類型不必相同。

</>復(fù)制代碼

  1. let x: [string, number] = ["cyan", 10];

訪問(wèn)越界的元素,使用聯(lián)合類型替代。

枚舉

定義:enum colors { red, green, blue }
表義一種可以一一列舉的數(shù)據(jù)

特點(diǎn):

通過(guò)索引值訪問(wèn)定的數(shù)據(jù)。

通過(guò)定義的數(shù)據(jù)訪問(wèn)索引值。

對(duì)枚舉類型的數(shù)據(jù)添加起始索引值。

</>復(fù)制代碼

  1. enum color {
  2. red = 10, // 默認(rèn)索引值從0 開(kāi)始, 可以指定索引值
  3. green,
  4. blue
  5. }
  6. // 編譯之后: Object {10: "red", 11: "green", 12: "blue", red: 10, green: 11, blue: 12}
空值

void 類型 像是 與 any 類型相反,它表示沒(méi)有任何類型。 當(dāng)一個(gè)函數(shù)沒(méi)有返回值時(shí), 要指定 void 類型。

void 類型 只能賦值: undefiend 和 null。

</>復(fù)制代碼

  1. let unvoid: void = null;
  2. let unvoid1: void = undefined;
undefiend和null

undefeind和null兩者有各自的類型: undefined和null。 和void相似。

</>復(fù)制代碼

  1. let u: undefined = undefined;
  2. let n: null = null;

默認(rèn)情況下null 和undefined 是所有類型的子類型。
可以把null 和undefined賦值給number類型的變量。

類型斷言

類型斷言,類似其它語(yǔ)言里的類型轉(zhuǎn)換。但是不進(jìn)行特殊的數(shù)據(jù)檢查和解構(gòu)。 沒(méi)有運(yùn)行時(shí)的影響,只是在編譯階段其作用。

尖括號(hào)<>語(yǔ)法

</>復(fù)制代碼

  1. let someValue: any = "colors";
  2. let strlength: number = (someValue).length;
  3. console.log(strlength);
變量聲明 let&const

const 是對(duì)let的一個(gè)增強(qiáng),能阻止對(duì)一個(gè)變量再次賦值。

let 和 const 的區(qū)別:
所有變量除了計(jì)劃要去修改的都應(yīng)該使用const。
基本原則就是如果一個(gè)變量不需要對(duì)它寫入,那么其它使用這些代碼的人也不能夠?qū)懭胨鼈儭?br>使用const可以更容易推測(cè)數(shù)據(jù)的流動(dòng)性。

解構(gòu)

解構(gòu)數(shù)組

不需要指定類型

</>復(fù)制代碼

  1. let input = [1, 2];
  2. let [fisrt, second] = input;
  3. console.log(fisrt, second); // 1 ,2

對(duì)象結(jié)構(gòu)

</>復(fù)制代碼

  1. let o = {
  2. a: "foo",
  3. b: 12,
  4. c: "bar"
  5. }
  6. let {a, b} = o;
  7. console.log( a, b );
函數(shù)

TypeScript函數(shù)可以創(chuàng)建有名字的函數(shù)和匿名函數(shù)
TypeScript函數(shù)執(zhí)行返回值需要定義數(shù)據(jù)類型,如果沒(méi)有結(jié)果則要定義為void。
TypeScript函數(shù),參數(shù)需要定義類型,在調(diào)用的時(shí)候,傳遞的參數(shù)一定要跟定義時(shí)的參數(shù)個(gè)數(shù)一樣。否則編譯報(bào)錯(cuò)。

</>復(fù)制代碼

  1. function add (a:number, b:number):number {
  2. return a + b;
  3. }
  4. let sum = add(10, 20);
  5. console.log( sum );

</>復(fù)制代碼

  1. // 定義void返回值
  2. setProperty();
  3. function setProperty (): void {
  4. console.log("success");
  5. }
可選參數(shù)和默認(rèn)參數(shù)

在TypeScript中可以在參數(shù)名旁邊使用 ? 實(shí)現(xiàn)可選參數(shù)

</>復(fù)制代碼

  1. function count (str1: string, str2?: string): string {
  2. return str1 + "--" + str2;
  3. }
  4. let reslut = count("xixi");
  5. console.log( reslut );
剩余參數(shù)

剩余參數(shù)會(huì)被當(dāng)作個(gè)數(shù)不限的可選參數(shù)。可以一個(gè)都沒(méi)有,同樣也可以有任意個(gè)。
語(yǔ)法:...nameProperty

</>復(fù)制代碼

  1. function builName (numa1: string, ...restOfName: string[]) { // 剩余參數(shù)保存在數(shù)組中
  2. }
Class

在TypeScript中,可以通過(guò)Class來(lái)定義一個(gè)類。在編譯之后,會(huì)編譯成JavaScript一個(gè)閉包函數(shù)類。

語(yǔ)法: class className {}

成員方法,成員屬性

在類中添加的屬性會(huì)編譯到構(gòu)造函數(shù)中,該屬性如果不賦值,則不會(huì)被編譯.
在類中添加的方法會(huì)編譯到構(gòu)造函數(shù)的Prototype上。

</>復(fù)制代碼

  1. class Price {
  2. price: number = 10;
  3. fn( num: number ): string {
  4. return num * 2;
  5. }
  6. }

編譯之后的結(jié)果:

</>復(fù)制代碼

  1. //Compiled TypeScript
  2. var Price = (function () {
  3. function Price() {
  4. this.price = 10;
  5. }
  6. Price.prototype.fn = function (num) {
  7. return num * 2;
  8. };
  9. return Price;
  10. })();
靜態(tài)屬性,靜態(tài)方法

靜態(tài)屬性:通過(guò)static關(guān)鍵字定義,定義的該屬性,在 類中訪問(wèn)不到, 因?yàn)槎x在類上。
靜態(tài)方法:通過(guò)static關(guān)鍵字定義,定義的該方法,在類中是訪問(wèn)不到(不能通過(guò)this訪問(wèn)),因?yàn)樵摲椒ǘx在類上。

</>復(fù)制代碼

  1. class Person {
  2. static name: string = "time";
  3. static fn(num: number): void {
  4. console.log("success");
  5. }
  6. }
  7. let p1: Peson = new Person(); // 實(shí)例化

編譯之后:

</>復(fù)制代碼

  1. var Person = (function () {
  2. function Person() {
  3. }
  4. Person.fn = function (num) {
  5. console.log("success");
  6. console.log(Peson.name);
  7. };
  8. Person.name = "time";
  9. return Person;
  10. })();
  11. var p1 = new Person();
構(gòu)造函數(shù)

在實(shí)例化的時(shí)候被調(diào)用
構(gòu)造函數(shù)中定義的語(yǔ)句會(huì)編譯到JavaScript的構(gòu)造函數(shù)中。
構(gòu)造函數(shù)不能聲明返回類型。
類定義的屬性(賦值的屬性)會(huì)被編譯到JavaScirpt的構(gòu)造函數(shù)中。

</>復(fù)制代碼

  1. class Book {
  2. name: string;
  3. page: number = 400;
  4. constructor(bookName: string) {
  5. this.name = bookName;
  6. console.log(bookName);
  7. }
  8. }
  9. let p1: Book = new Book("莊子");

編譯之后:

</>復(fù)制代碼

  1. var Book = (function () {
  2. function Book(bookName) {
  3. this.page = 400;
  4. this.name = bookName;
  5. console.log(bookName);
  6. }
  7. return Book;
  8. })();
  9. var p1 = new Book("莊子");
繼承

語(yǔ)法:子類 extends 父類

</>復(fù)制代碼

  1. class Base {
  2. press: string = "one";
  3. }
  4. class Book extends Base {
  5. name: string = "老子";
  6. sayName(): string {
  7. return this.name;
  8. }
  9. }
  10. let b: Book = new Book();
  11. let bookname = b.sayName();
  12. console.log(bookname);

編譯之后:
通過(guò)的是混合式繼承

</>復(fù)制代碼

  1. var __extends = this.__extends || function (d, b) {
  2. for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
  3. function __() { this.constructor = d; }
  4. __.prototype = b.prototype;
  5. d.prototype = new __();
  6. };
  7. var Base = (function () {
  8. function Base() {
  9. this.press = "one";
  10. }
  11. return Base;
  12. })();
  13. var Book = (function (_super) {
  14. __extends(Book, _super);
  15. function Book() {
  16. _super.apply(this, arguments);
  17. this.name = "老子";
  18. }
  19. Book.prototype.sayName = function () {
  20. return this.name;
  21. };
  22. return Book;
  23. })(Base);
  24. var b = new Book();
  25. var bookname = b.sayName();
  26. console.log(bookname);

——extends(); 方法

</>復(fù)制代碼

  1. var __extends = this.__extends || function (d, b) { // b 父類
  2. for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
  3. function __() { this.constructor = d; }
  4. __.prototype = b.prototype;
  5. d.prototype = new __();
  6. };

目的, 實(shí)現(xiàn)只繼承 父類的原型對(duì)象。 從原型對(duì)象入手
1,function __() {}創(chuàng)建一個(gè)空函數(shù), 目的:空函數(shù)進(jìn)行中轉(zhuǎn),把父類的模板屏蔽掉, 父類的原型取到。
2,__.prototype = b.prototype實(shí)現(xiàn)空函數(shù)的原型對(duì)象 和 超類的原型對(duì)象轉(zhuǎn)換
3,d.prototype = new __()原型繼承

使用for-in循環(huán),子類繼承父類的靜態(tài)屬性或方法。(通過(guò)一個(gè)函數(shù)中轉(zhuǎn),實(shí)現(xiàn),只實(shí)例化一次,且繼承了一次父類的原型對(duì)象)
通過(guò)寄生類繼承父類原型上的屬性或方法。
在子類中運(yùn)行構(gòu)造函數(shù)式繼承實(shí)現(xiàn)對(duì)父類的構(gòu)造函數(shù)繼承。

super()
在包含constructor函數(shù)的子類中必須調(diào)用super().它會(huì)執(zhí)行基類的構(gòu)造方法。

傳遞給super()方法就是實(shí)現(xiàn)構(gòu)造函數(shù)繼承屬性
子類構(gòu)造函數(shù)中添加屬性。
繼承父類構(gòu)造函數(shù)中的屬性,如果子類定義構(gòu)造函數(shù)就必須繼承。

</>復(fù)制代碼

  1. class Base {
  2. press: string = "one";
  3. name: string;
  4. constructor ( bookName: string ) {
  5. this.name = bookName;
  6. }
  7. }
  8. class Book extends Base {
  9. price: number;
  10. // name: string = "老子";
  11. constructor(bookName: string, price: number) {
  12. // 父類繼承屬性
  13. super(bookName); // 會(huì)執(zhí)行父類的 constructor
  14. this.price = price;
  15. }
  16. sayName(): string {
  17. return this.name;
  18. }
  19. }
  20. let b: Book = new Book("老子", 40);
  21. let bookname = b.sayName();
  22. console.log(bookname);
接口

在TypeScript中,接口的作用:為這些類型命名和為你的代碼或第三方代碼定義契約。
TypeScript的核心原則之一是:對(duì)值所具有的shape進(jìn)行類型檢查。
定義一種數(shù)據(jù)格式,來(lái)約束變量的類型。
接口中定義的每個(gè)接口,都可以當(dāng)作一種類型來(lái)使用。
可選實(shí)現(xiàn)成員,可以在后面添加?.

語(yǔ)法:interface names {};

接口定義對(duì)象

</>復(fù)制代碼

  1. // 定義接口
  2. interface Person {
  3. name: string;
  4. age: number;
  5. sex: string;
  6. hobby?: any;
  7. }
  8. // 使用接口
  9. function getName (person: Person): string {
  10. return person.name;
  11. }
  12. // 實(shí)現(xiàn)接口
  13. var n: string = getName({
  14. name: "one",
  15. age: 23,
  16. sex: "nv"
  17. });
  18. console.log(n);
接口函數(shù)

語(yǔ)法:interface name {}
定義函數(shù)格式.通過(guò)()來(lái)定義參數(shù)個(gè)數(shù),并聲明函數(shù)返回值類型。

作用:限制了定義該函數(shù)類型的規(guī)范。

</>復(fù)制代碼

  1. // 定義抽象類
  2. interface Add {
  3. (num1: number, num2: number): number;
  4. }
  5. // 使用接口
  6. let fn:Add;
  7. // 實(shí)現(xiàn)接口
  8. fn = function ( num1: number, num2: number ): number {
  9. return num1 + num2;
  10. }
  11. var reslut: number = fn(10 , 20);
  12. console.log(reslut);
類的接口定義

語(yǔ)法:

</>復(fù)制代碼

  1. interface className {
  2. key: type;
  3. fn(arg: type): type;
  4. }

實(shí)現(xiàn)接口:

</>復(fù)制代碼

  1. class Times implements Base {}

作用:保證代碼的安全性

</>復(fù)制代碼

  1. "use strict";
  2. // 時(shí)間接口
  3. interface Base {
  4. current: string;
  5. getCurrentDate(): string;
  6. }
  7. // 使用接口
  8. class Times implements Base {
  9. current: string;
  10. constructor( d: string ){
  11. this.current = d;
  12. }
  13. getCurrentDate (): string {
  14. return this.current;
  15. }
  16. }
  17. let d: Times = new Times(new Date().toString());
  18. console.log(d);
模塊

在TypeScript1.5中:內(nèi)部模塊 是說(shuō)所的命名空間外部模塊則稱之為模塊

語(yǔ)法:

</>復(fù)制代碼

  1. module name {}

通過(guò) export關(guān)鍵字, 將模塊的方法屬性暴露出來(lái)。
在模塊的外部訪問(wèn)模塊,需要通過(guò)模塊名稱,點(diǎn)語(yǔ)法調(diào)用模塊內(nèi)部暴露的接口

</>復(fù)制代碼

  1. "use strict";
  2. // 定義模塊
  3. module startModuel {
  4. let info: string = "colors";
  5. // 暴露一個(gè)class
  6. export class Satrt {
  7. name: string;
  8. constructor(name: string) {
  9. this.name = name;
  10. }
  11. getName(): string {
  12. return this.name;
  13. }
  14. }
  15. }
  16. // 實(shí)例化模塊中暴露的接口
  17. let satr:startModuel.Satrt = new startModuel.Satrt("cyan");
  18. console.log( satr );
  19. console.log(satr.getName());

模塊在其自身的作用域里執(zhí)行,而不是在全局作用域里。
一個(gè)模塊里的比那兩,函數(shù),類等等在模塊外部是不可見(jiàn)的,需要通過(guò)export形式向外暴露。
如果一個(gè)模塊想使用其它模塊導(dǎo)出的變量,函數(shù),類,接口等。需要使用import形成引入。

模塊是自聲明的。兩個(gè)模塊之間的關(guān)系是通過(guò)在文件級(jí)別上使用imports和 exports 建立聯(lián)系的。

導(dǎo)出

導(dǎo)出聲明

</>復(fù)制代碼

  1. export interface StringValidator {
  2. isAcce(s: string): boolean;
  3. }
  4. export const numberRegExp = /^[0-9]+$/;

導(dǎo)出語(yǔ)句

</>復(fù)制代碼

  1. export class ZipCode implements StringValidator {
  2. isAcce(s: string) {
  3. return s.length === 5 && numberRegExp.test(s);
  4. }
  5. }
  6. // 導(dǎo)出語(yǔ)句
  7. export { ZipCode }
導(dǎo)入

使用關(guān)鍵字:import 來(lái)導(dǎo)入其它模塊中的導(dǎo)出內(nèi)容

</>復(fù)制代碼

  1. import { ZipCode } form "./ZipCode";
  2. let myValid = new ZipCode();

</>復(fù)制代碼

  1. // 對(duì)導(dǎo)入的內(nèi)容重新命名
  2. import {ZipCode as ZVC } form ""./ZipCode;
  3. let myValid = new ZVC();

默認(rèn)導(dǎo)出

每個(gè)模快都有一個(gè)defalut導(dǎo)出。 默認(rèn)導(dǎo)出使用default 關(guān)鍵字標(biāo)記。
例如:JQuery的類庫(kù)有一個(gè)默認(rèn)導(dǎo)出JQuery或$.

</>復(fù)制代碼

  1. let $:jQuery;
  2. export default $;

</>復(fù)制代碼

  1. import $ from "JQuery";
模塊路徑解析

TypeScript存在兩種路徑解析方式: Node和Classic(原本TypeScirpt路徑解析規(guī)則,為了向后兼容)

TypeScript是模范Node運(yùn)行時(shí)解析策略來(lái)編譯階段定義模塊文件。
TypeScript在Node解析邏輯基礎(chǔ)上增加了TypeScript源文件的擴(kuò)展名(.ts,.tsx,.d.ts).

命名空間

命名空間是位于全局命名空間下的一個(gè)普通的帶有名字的JavaScript對(duì)象

使用關(guān)鍵字:namespace

</>復(fù)制代碼

  1. namescope Valiation {
  2. export interface StringValidator {
  3. isAcce(s: string): boolean;
  4. }
  5. const lettesRegExp = /^[A-Za-z]+$/;
  6. }

多文件的命名空間

不同的文件,但是仍是同一個(gè)命名空間,并且在使用的時(shí)候,就如同他們?cè)谝粋€(gè)文件中定義的一樣。 因?yàn)椴煌募g存在依賴關(guān)系,所以加入了引用標(biāo)簽來(lái)告知編譯器文件之間的關(guān)聯(lián)。

</>復(fù)制代碼

  1. namescope Valiation {
  2. export interface StringValidator {
  3. isAcce(s: string): boolean;
  4. }
  5. }
  6. namescope Valiation {
  7. const lettesRegExp = /^[A-Za-z]+$/;
  8. expots class LetterOnly implements StringValidator {
  9. isAcce(s: string): boolean {
  10. return s.length && lettesRegExp.test(s);
  11. }
  12. }
  13. }

</>復(fù)制代碼

  1. // 測(cè)試
  2. ///
  3. ///
  4. let strings = ["Hello", "98052"];
  5. let validators: { [s: string]: Validation.StringValidator; } = {};
  6. validators["ZIP code"] = new Validation.ZipCodeValidator();
  7. validators["Letters only"] = new Validation.LettersOnlyValidator();
  8. strings.forEach(s => {
  9. for (let name in validators) {
  10. console.log(""" + s + "" " + (validators[name].isAcce(s) ? " matches " : " does not match ") + name);
  11. }
  12. });

編譯方式:

把所有輸入的文件編譯一個(gè)輸出文件,需要使用--outFile標(biāo)記

tsc --outFile sample.js Test.ts
變異其會(huì)根據(jù)源碼中引用標(biāo)簽自動(dòng)的對(duì)輸出進(jìn)行排序。
可以多帶帶指定每個(gè)文件
tsc --outFile sample.js Validation.ts LettersOnlyValidator.ts ZipCodeValidator.ts Test.ts

可以編譯成每一個(gè)文件(默認(rèn)方式),每個(gè)源文件都會(huì)對(duì)應(yīng)生成一個(gè)JavaScript文件。然后,在頁(yè)面上通過(guò)

閱讀需要支付1元查看
<