摘要:编译器会根据这个列表去处理函数的调用。泛型泛型接口使用尖括号传入泛型变量,它会根据参会类型智能赋值。泛型类在这里,泛型作为一种变量,可供用户调用的时候动态约束类属性。在泛型约束中使用类型参数
demo
使用ts完成一个todomvc的demo
核心概念 接口 参数校验interface LabelledValue { label: string; } function printLabel(labelledObj: LabelledValue) { console.log(labelledObj.label); } let myObj = {size: 10, label: "Size 10 Object"}; printLabel(myObj);
接口可以用来校验参数的类型,参数是否存在等等。
属性预定义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"});属性只读
interface Point { readonly x: number; readonly y: number; } let p1: Point = { x: 10, y: 20 }; p1.x = 5; // error!注意事项
对象字面量形式会被特殊对待而且会经过额外属性检查
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; }可索引的类型
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(arg: T): T { return arg; }
使用尖括号传入泛型变量,它会根据参会类型智能赋值。比如arg是number,那么T就会被赋值为number。
泛型类class GenericNumber{ zeroValue: T; add: (x: T, y: T) => T; } let myGenericNumber = new GenericNumber (); 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://www.ucloud.cn/yun/99966.html
摘要:调用通过注册表调用到实例,透过的,调用到中的,最后通过,调用,根据参数相应模块执行。京东的,多端解决方案是一套遵循语法规范的多端开发解决方案。 showImg(https://segmentfault.com/img/bVbuMkw?w=1304&h=808); 对于一项技术,我们不能停留在五分钟状态,特别喜欢一句话,用什么方式绘制UI界面一点不重要,重要的是底层的思维,解决问题和优化...
摘要:调用通过注册表调用到实例,透过的,调用到中的,最后通过,调用,根据参数相应模块执行。京东的,多端解决方案是一套遵循语法规范的多端开发解决方案。 showImg(https://segmentfault.com/img/bVbuMkw?w=1304&h=808); 对于一项技术,我们不能停留在五分钟状态,特别喜欢一句话,用什么方式绘制UI界面一点不重要,重要的是底层的思维,解决问题和优化...
摘要:调用通过注册表调用到实例,透过的,调用到中的,最后通过,调用,根据参数相应模块执行。京东的,多端解决方案是一套遵循语法规范的多端开发解决方案。 showImg(https://segmentfault.com/img/bVbuMkw?w=1304&h=808); 对于一项技术,我们不能停留在五分钟状态,特别喜欢一句话,用什么方式绘制UI界面一点不重要,重要的是底层的思维,解决问题和优化...
摘要:使用官方的的另外一种版本和一起使用自动配置了一个项目支持。需要的依赖都在文件中。带静态类型检验,现在的第三方包基本上源码都是,方便查看调试。大型项目首选和结合,代码调试维护起来极其方便。 showImg(https://segmentfault.com/img/bVbrTKz?w=1400&h=930); 阿特伍德定律,指的是any application that can be wr...
阅读 3352·2021-09-08 09:45
阅读 1269·2019-08-30 15:53
阅读 1549·2019-08-30 14:12
阅读 994·2019-08-29 17:01
阅读 2588·2019-08-29 15:35
阅读 414·2019-08-29 13:09
阅读 1989·2019-08-29 12:32
阅读 3099·2019-08-26 18:37