接口ide
TypeScript的核心原则之一是对值所具备的结构进行类型检查。它有时被称作“鸭式辨型法”或“结构性子类型化”。在TypeScript里,接口的做用就是为这些类型命名和为你的代码或第三方代码定义契约。函数
// 接口 // TypeScript的核心原则之一是对值所具备的结构进行类型检查。 // 在TypeScript里,接口的做用就是为这些类型命名和为你的代码或第三方代码定义契约。 interface LabelValue { label: string; } function prientLabel(labelObj: LabelValue) { console.log(labelObj.label); } let myObj = { 'label': 'hello Interface' }; prientLabel(myObj); // LabelledValue 接口就比如一个名字,它表明了有一个 label 属性且类型为 string 的对象。 // 只要传入的对象知足上述必要条件,那么它就是被容许的。 // 可选属性 // 带有可选属性的接口与普通的接口定义差很少,只是在可选属性名字定义的后面加一个 ? 符号。 // 可选属性的好处之一是能够对可能存在的属性进行预约义,好处之二是能够捕获引用了不存在的属性时的错误。 interface Person { name?: string; age?: number; } function printInfo(info: Person) { console.log(info); } let info = { 'name': 'cd', 'age': 23 }; printInfo(info); // {name: "cd", age: 23} let info2 = { 'name': 'cd' }; printInfo(info2); // {name: "cd"} // 函数类型 // 接口可以描述 JavaScript 中对象拥有的各类各样的外形。 除了描述带有属性的普通对象外,接口也能够描述函数类型。 // 定义的函数类型接口就像是一个只有参数列表和返回值类型的函数定义。参数列表里的每一个参数都须要名字和类型。 // 定义后完成后,咱们能够像使用其它接口同样使用这个函数类型的接口。 interface SearchFunc { (source: string, subString: string): boolean; } let mySearch: SearchFunc; mySearch = function(source: string,subString: string) { return source.search(subString) !== -1; }; console.log(mySearch('路飞', '路')); // true console.log(mySearch('路飞', '龙')); // false // 可索引类型 // 与使用接口描述函数类型差很少,咱们也能够描述那些可以“经过索引获得”的类型,好比 a[10] 或 ageMap['daniel']。 // 可索引类型具备一个索引签名,它描述了对象索引的类型,还有相应的索引返回值类型。 interface StringArray{ [index: number]: string; } let MyArray: StringArray; MyArray = ['是', '云' , '随' , '风']; console.log(MyArray[2]); // 随 // 类类型 // 与 C# 或 Java 里接口的基本做用同样,TypeScript 也可以用它来明确的强制一个类去符合某种契约。 // 咱们能够在接口中描述一个方法,在类里实现它,如同下面的 setTime 方法同样: interface ClockInterface { currentTime: Date; setTime(d: Date); } class Clock implements ClockInterface { currentTime: Date; setTime(d: Date){ this.currentTime = d; } constructor(h: number, m: number) {} } // 继承接口 // 和类同样,接口也能够相互继承。 // 这让咱们可以从一个接口里复制成员到另外一个接口里,能够更灵活地将接口分割到可重用的模块里。 // 一个接口能够继承多个接口,建立出多个接口的合成接口。 interface Shape { color: string; } interface PenStroke { penWidth: number; } interface Square extends Shape, PenStroke { sideLength: number; } let s = <Square>{}; s.color = 'blue'; s.penWidth = 100; s.sideLength = 10; console.log(s); // {color: "blue", penWidth: 100, sideLength: 10}
泛型this
软件工程中,咱们不只要建立一致的定义良好的API,同时也要考虑可重用性。组件不只可以支持当前的数据类型,同时也能支持将来的数据类型,这在建立大型系统时为你提供了十分灵活的功能。spa
在像C#和Java这样的语言中,可使用泛型来建立可重用的组件,一个组件能够支持多种类型的数据。这样用户就能够以本身的数据类型来使用组件。code
// 泛型 // 以下代码,咱们给 Hello 函数添加了类型变量 T ,T 帮助咱们捕获用户传入的类型(好比:string)。 // 咱们把这个版本的 Hello 函数叫作泛型,由于它能够适用于多个类型。 // 代码中 output 和 output2 是效果是相同的, // 第二种方法更加广泛,利用了类型推论 —— 即编译器会根据传入的参数自动地帮助咱们肯定T的类型。 function Hello<T>(arg: T): T { return arg; } let outPut = Hello<string>('Hello Generic'); let output2 = Hello('Hello Generic') console.log(outPut); console.log(output2);
做者:longWinter666对象