运用webpack + react + redux + typescript搭建脚手架

demo

运用ts完成一个todomvc的demo

《运用webpack + react + redux + typescript搭建脚手架》

中心观点

接口

参数校验

 interface LabelledValue {
  label: string;
}

function printLabel(labelledObj: LabelledValue) {
  console.log(labelledObj.label);
}

let myObj = {size: 10, label: "Size 10 Object"};
printLabel(myObj);

《运用webpack + react + redux + typescript搭建脚手架》

接口可以用来校验参数的范例,参数是不是存在等等。

属性预定义

interface SquareConfig {
    color?: string;
    width?: number;
  }
  
function createSquare(config: SquareConfig): { color: string; area: number } {
    let newSquare = {color: "white", area: 100};
    if (config.clor) {
      // Error: Property 'clor' does not exist on type 'SquareConfig'
      newSquare.color = config.clor;
    }
    if (config.width) {
      newSquare.area = config.width * config.width;
    }
    return newSquare;
}
  
let mySquare = createSquare({color: "black"}); 

《运用webpack + react + redux + typescript搭建脚手架》

属性只读

interface Point {
    readonly x: number;
    readonly y: number;
} 

let p1: Point = { x: 10, y: 20 };
p1.x = 5; // error!

《运用webpack + react + redux + typescript搭建脚手架》

注意事项

对象字面量情势会被特别看待而且会经由分外属性搜检

interface SquareConfig {
    color?: string;
    width?: number;
}

function createSquare(config: SquareConfig): { color: string; area: number } {
    let newSquare = { color: "white", area: 100 };
    if (config.clor) {
        // Error: Property 'clor' does not exist on type 'SquareConfig'
        newSquare.color = config.clor;
    }
    if (config.width) {
        newSquare.area = config.width * config.width;
    }
    return newSquare;
}

let mySquare = createSquare({ color: "black" });

createSquare({ colour: "red", width: 100 }); 
// Error: Property 'colour does no exist on type 'SquareConfig'

假如想处置惩罚这个题目有三种处置惩罚办法

// 1. 将对象字面量复制给变量,传入变量不会被举行分外属性搜检
let skipLiteral = { colour: "red", width: 100 };
createSquare(skipLiteral);

// 2.采纳范例断言,运用as操作符,通知编译器我传入的参数对象就是你要的范例
createSquare({ colour: "red", width: 100 } as SquareConfig);

// 3.第三种体式格局,增加全能校验符,这个标记会包涵color、width以外一切其他属性,慎用
interface SquareConfig {
    color?: string;
    width?: number;
    [propName: string]: any;
} 

函数范例

interface SearchFunc {
  (source: string, subString: string): boolean;
} 

《运用webpack + react + redux + typescript搭建脚手架》

可索引的范例

interface StringArray {
  [index: number]: string;
}

let myArray: StringArray;
myArray = ["Bob", "Fred"];

let myStr: string = myArray[0]; 

ts支撑两种索引署名,字符串和数值,同时运用的时刻,数值索引返回的范例必需是字符串索引返回范例的子类,由于js剖析的时刻会将数值索引转换为字符串索引,所以数值索引返回的范例必需与字符串返回的范例保持一致(或子类)。

class Animal {
    name: string;
}
class Dog extends Animal {
    breed: string;
}

// 毛病:运用数值型的字符串索引,有时会获得完整差别的Animal!
interface NotOkay {
    [x: number]: Animal;
    [x: string]: Dog;
} 

类范例

与C#或Java里接口的基础作用一样,TypeScript也可以用它来明白的强迫一个类去相符某种左券。

interface ClockInterface {
    currentTime: Date;
}

class Clock implements ClockInterface {
    currentTime: Date;
    constructor(h: number, m: number) { }
} 

接口继续

interface Shape {
    color: string;
}

interface Square extends Shape {
    sideLength: number;
} 

继续 extends

class Animal {
    move(distanceInMeters: number = 0) {
        console.log(`Animal moved ${distanceInMeters}m.`);
    }
}

class Dog extends Animal {
    bark() {
        console.log('Woof! Woof!');
    }
}

const dog = new Dog();
dog.bark();
dog.move(10);
dog.bark(); 

存取器

let passcode = "secret passcode";

class Employee {
    private _fullName: string;

    get fullName(): string {
        return this._fullName;
    }

    set fullName(newName: string) {
        if (passcode && passcode == "secret passcode") {
            this._fullName = newName;
        }
        else {
            console.log("Error: Unauthorized update of employee!");
        }
    }
}

let employee = new Employee();
employee.fullName = "Bob Smith";
if (employee.fullName) {
    alert(employee.fullName);
} 

静态属性 static

class Grid {
    static origin = {x: 0, y: 0};
    calculateDistanceFromOrigin(point: {x: number; y: number;}) {
        let xDist = (point.x - Grid.origin.x);
        let yDist = (point.y - Grid.origin.y);
        return Math.sqrt(xDist * xDist + yDist * yDist) / this.scale;
    }
    constructor (public scale: number) { }
}

let grid1 = new Grid(1.0);  // 1x scale
let grid2 = new Grid(5.0);  // 5x scale

console.log(grid1.calculateDistanceFromOrigin({x: 10, y: 10}));
console.log(grid2.calculateDistanceFromOrigin({x: 10, y: 10})); 

把类当作接口运用

class Point {
    x: number;
    y: number;
}

interface Point3d extends Point {
    z: number;
}

let point3d: Point3d = {x: 1, y: 2, z: 3}; 

函数

let myAdd: (x: number, y: number) => number =
    function(x: number, y: number): number { return x + y; }; 

重载

要领是为同一个函数供应多个函数范例定义来举行函数重载。 编译器会依据这个列表去处置惩罚函数的挪用。

let suits = ["hearts", "spades", "clubs", "diamonds"];

function pickCard(x: {suit: string; card: number; }[]): number;
function pickCard(x: number): {suit: string; card: number; };
function pickCard(x): any {
    // Check to see if we're working with an object/array
    // if so, they gave us the deck and we'll pick the card
    if (typeof x == "object") {
        let pickedCard = Math.floor(Math.random() * x.length);
        return pickedCard;
    }
    // Otherwise just let them pick the card
    else if (typeof x == "number") {
        let pickedSuit = Math.floor(x / 13);
        return { suit: suits[pickedSuit], card: x % 13 };
    }
}

let myDeck = [{ suit: "diamonds", card: 2 }, { suit: "spades", card: 10 }, { suit: "hearts", card: 4 }];
let pickedCard1 = myDeck[pickCard(myDeck)];
alert("card: " + pickedCard1.card + " of " + pickedCard1.suit);

let pickedCard2 = pickCard(15);
alert("card: " + pickedCard2.card + " of " + pickedCard2.suit); 

泛型

泛型接口

function identity<T>(arg: T): T {
    return arg;
} 

运用尖括号传入泛型变量,它会依据参会范例智能赋值。比方arg是number,那末T就会被赋值为number。

泛型类

class GenericNumber<T> {
    zeroValue: T;
    add: (x: T, y: T) => T;
}

let myGenericNumber = new GenericNumber<number>();
myGenericNumber.zeroValue = 0;
myGenericNumber.add = function(x, y) { return x + y; }; 

在这里,泛型作为一种变量,可供用户挪用的时刻动态束缚类属性。

在泛型束缚中运用范例参数

function getProperty(obj: T, key: K) {
    return obj[key];
}

let x = { a: 1, b: 2, c: 3, d: 4 };

getProperty(x, "a"); // okay
getProperty(x, "m"); // error: Argument of type 'm' isn't assignable to 'a' | 'b' | 'c' | 'd'. 
    原文作者:吴霸霸
    原文地址: https://segmentfault.com/a/1190000017353265
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞