一种定义复杂类型的格式, 好比咱们用对象格式存储一篇文章, 那么就能够用接口定义文章的类型:vue
interface Article {
title: stirng;
count: number;
content:string;
fromSite: string;
}
const article: Article = {
title: '为vue3学点typescript(2), 类型',
count: 9999,
content: 'xxx...',
fromSite: 'baidu.com'
}
复制代码
在这种状况下,当咱们给article
赋值的时候, 若是任何一个字段没有被赋值或者字段对应的数据类型不对, ts都会提示错误, 这样就保证了咱们写代码不会出现上述的小错误.typescript
仍是上面的例子, fromSite
的意思是文章来自那个网站,若是文章都是原创的, 该字段就不会有值, 可是若是咱们不传又会提示错误, 怎么办? 这时候就须要标记fromSite
字段为非必填, 用"?"标记:bash
interface Article {
title: stirng;
count: number;
content:string;
fromSite?: string; // 非必填
}
// 不会报错
const article: Article = {
title: '为vue3学点typescript(2), 类型',
count: 9999,
content: 'xxx...',
}
复制代码
接口不只能够定义对象, 还能够定义函数:函数
// 声明接口
interface Core {
(n:number, s:string):[number,string]
}
// 声明函数遵循接口定义
const core:Core = (a,b)=>{
return [a,b];
}
复制代码
实现(implements)是面向对象中的一个重要概念。通常来说,一个类只能继承自另外一个类,有时候不一样类之间能够有一些共有的特性,这时候就能够把特性提取成接口(interfaces),用 implements
关键字来实现。这个特性大大提升了面向对象的灵活性。网站
先简单看下如何给类定义接口:ui
// 定义
interface Animate {
head:number;
body:number;
foot:number;
eat(food:string):void;
say(word:string):string;
}
// implements
class Dog implements Animate{
head=1;
body=1;
foot=1;
eat(food:string){
console.log(food);
}
say(word:string){
return word;
}
}
复制代码
一个类能够实现多个接口:spa
interface Alarm {
alert();
}
interface Light {
lightOn();
lightOff();
}
class Car implements Alarm, Light {
alert() {
console.log('Car alert');
}
lightOn() {
console.log('Car light on');
}
lightOff() {
console.log('Car light off');
}
}
复制代码
上例中,Car
实现了 Alarm
和 Light
接口,既能报警,也能开关车灯。3d
接口与接口之间能够是继承关系:code
interface Alarm {
alert();
}
interface LightableAlarm extends Alarm {
lightOn();
lightOff();
}
复制代码
上例中,咱们使用 extends
使 LightableAlarm
继承 Alarm
。对象
接口也能够继承类:
class Point {
x: number;
y: number;
}
interface Point3d extends Point {
z: number;
}
let point3d: Point3d = {x: 1, y: 2, z: 3};
复制代码
能够使用接口的方式来定义一个函数须要符合的形状:
interface SearchFunc {
(source: string, subString: string): boolean;
}
let mySearch: SearchFunc;
mySearch = function(source: string, subString: string) {
return source.search(subString) !== -1;
}
复制代码
有时候,一个函数还能够有本身的属性和方法:
interface Counter {
(start: number): string;
interval: number;
reset(): void;
}
function getCounter(): Counter {
let counter = <Counter>function (start: number) { };
counter.interval = 123;
counter.reset = function () { };
return counter;
}
let c = getCounter();
c(10);
c.reset();
c.interval = 5.0;
复制代码