TypeScript 接口

TS的接口好像C#/Java中的接口 , 但是TS的interface是不能继承(implement)其他的interface , 但是TS的interface可以规范自己的结构Object.无论如何TS比起JS来说,在OOP上面进步了不少.

注 : 下面的代码都是TS代码


/**
 * Created by CV-PC153 on 2017/8/7.
 */
interface User{
    id:number;
    name:string;
}
function greeter(user:User):string{
    return `No.${user.id}, name is :${user.name}`;
}
let myObj : User = { id : 1 ,name : "Aonaufly" };

document.body.innerHTML = greeter(myObj);

运行结果:

这里有一个奇怪的现象:

/**
 * Created by CV-PC153 on 2017/8/7.
 */
interface User{
    id:number;
    name:string;
}
function greeter(user:User):string{
    return `No.${user.id}, name is :${user.name}`;
}
let myObj = { age : 1 ,id : 1 ,name : "Aonaufly"};

document.body.innerHTML = greeter(myObj);

以上代码 , 去掉了myObj的类型 , 并且加上了一个age : 1 依然可以得到一个正确的结果.

继续更改在greeter方法中打印出user.age , 会报错:

结果编译报错:

很有意思 , 可以给个总结 :

object 没有强制指定是interface(上文中的User)类型的话 , 只要它包含了User所有属性,它任然可以当做User使用.方法中的参数,如果被限定为interface(上文中的User),那此方法只能使用interface限定的方法.反之若参数不限制:

/**
 * Created by CV-PC153 on 2017/8/7.
 */
interface User{
    id:number;
    name:string;
}
function greeter(user:any):string{
    return `No.${user.id}, name is :${user.name} , age : ${ user.age }`;
}
let myObj = { age : 1 ,id : 1 ,name : "Aonaufly"};

document.body.innerHTML = greeter(myObj);

结果如下:

但这样显然又不符合OOP的思想了.

可选属性: (?符号 如 age?:number 那么age就是一个可选属性),顾名思义,继承者可选属性赋值

/**
 * Created by CV-PC153 on 2017/8/7.
 */
interface User{
    id:number;
    name:string;
    age?:number;
}
function greeter(user:User):string{
    return `No.${user.id}, name is :${user.name} , age : ${ user.age }`;
}
let myObj:User = { id : 1 ,name : "Aonaufly"};

document.body.innerHTML = greeter(myObj);

结果:

所以 , 可选属性有时候比较坑.你可能想显示age信息,结果忘了在myObj中定义,也不会报错.如下代码:

/**
 * Created by CV-PC153 on 2017/8/7.
 */
interface User{
    id:number;
    name:string;
    age?:number;
}
function greeter(user:User):string{
    return `No.${user.id}, name is :${user.name} , age : ${ user.age }`;
}
let myObj:User = { id : 1 ,name : "Aonaufly" , age:1};

document.body.innerHTML = greeter(myObj);

如果定义了可选属性,一定要注意.

在interface中申明函数:

/**
 * Created by CV-PC153 on 2017/8/7.
 */
interface TalkPro{
    name : string;
    content : string;
}
interface SayFunc{
    (talk : TalkPro):string;
}
let iSay : SayFunc;
iSay = function(talk :TalkPro):string{
    return `${talk.name}:${talk.content}`;
}
function greeter( func :  SayFunc , talk : TalkPro ):string{
    return func(talk);
}
let i_went_talk : TalkPro = { name:"Aonaufly" , content:"interface SayFunc is like C# at statement function" };

document.body.innerHTML = greeter(iSay,i_went_talk);

SayFunc申明了一个方法 , 得到结果:

可索引的类型

数字索引的返回值必须是字符串索引返回值类型的子类型

类继承接口(动态性多态)

/**
 * Created by CV-PC153 on 2017/8/7.
 */
interface TalkPro{
    name : string;
    content : string;
}
interface SayClass{
    toTalk( ):string;
}
interface SayCtor{
    new( msg : TalkPro ) : SayClass;
}

class Chinese implements SayClass{
    private msg : TalkPro;
    constructor( msg : TalkPro ){
        this.msg = msg;
    }
    toTalk( ):string{
        return `[Chinese] ${this.msg.name}:${this.msg.content}`;
    }
}
class USA implements SayClass{
    private msg : TalkPro;
    constructor( msg : TalkPro ){
        this.msg = msg;
    }
    toTalk( ):string{
        return `[USA] ${this.msg.name}:${this.msg.content}`;
    }
}

function create_sayClass( ctor : SayCtor , msg : TalkPro ) : SayClass {
    return new ctor( msg );
}

let chinese_ : TalkPro = { name:"Aonaufly" , content:"ni hao!" };
let usa_ : TalkPro = { name:"Polo" , content:"hello!" };

let cla_chinese : SayClass = create_sayClass( Chinese , chinese_);
let cla_usa : SayClass = create_sayClass( USA , usa_);

function greeter( saycl : SayClass ):string{
    return saycl.toTalk();
}

document.body.innerHTML = greeter(cla_usa);

结果:

时间: 2024-11-04 10:40:43

TypeScript 接口的相关文章

02.TypeScript 接口

02.TypeScript 接口 TypeScript核心设计原则之一就是类型检查,而接口实际是为了这种类型检查而产生的,实际他并不会在生成的JavaScript里有半点体现. 一个简单的示例 // 定义IUser接口 interface IUser { name: string; // 姓名:字符串类型 age: number; // 年龄:数值类型 } function getUser(user: IUser) : string { return user.name + ':' + user

从C#到TypeScript - 接口

从C#到TypeScript - 接口 为了更好的抽象出行为和属性,TypeScript在ES6的基础上增加了接口interface.C#也有interface,不过TypeScript的接口还不大一样,C#里的接口一般是为类服务,让类实现接口中定义的方法或属性.TypeScript在C#基础上更进一步,由于JavaScript是门非常灵活的语言,TypeScript作为JavaScript的超集需要保持灵活性,所以接口在TypeScript里可以脱离具体的类,单独作为类似契约的存在,接口里的属

五、TypeScript 接口

转自:http://www.hubwiz.com/ 接口声明 在TypeScript中,接口是用作约束作用的,在编译成JavaScript的时候,所有的接口都会被擦除掉,因为 JavaScript中并没有接口这一概念.TypeScript中接口是用关键字interface进行声明,例如: interface LabelledValue { //定义接口 label: string;          //定义属性 } interface LabelledValue {  //定义接口 label

TypeScript接口

介绍 TypeScript的核心原则之一是对值所具有的结构进行类型检查. 它有时被称做“鸭式辨型法”或“结构性子类型化”. 在TypeScript里,接口的作用就是为这些类型命名和为你的代码或第三方代码定义契约. 接口初探 下面通过一个简单示例来观察接口是如何工作的: function printLabel(labelledObj: { label: string }) { console.log(labelledObj.label); } let myObj = { size: 10, lab

TYpeScript接口的使用

1.接口中的属性值的使用: 1 // 作用是强制类型检查 2 interface Iperson { 3 name: string; 4 age: string; 5 } 6 7 class Person { 8 constructor(public config:Iperson) { 9 10 } 11 } 12 13 let p1: Person = new Person({ 14 name: 'swe', 15 age:'12' 16 }); 2.接口中的方法的使用 没有多态.使用效果与J

typescript 接口的新认识

interface 用于接收服务器的数据. eg: interface mmmmm { x: string, y: number, z: number, select: KnockoutObservable<boolean>} $.post(url + '/app.ashx', ko.utils.stringifyJson( {x: '12', y: 1, z: 10 }), function (response) { var result = $.parseJSON(response); a

TypeScript接口学习心得之一

import { Component, OnInit } from '@angular/core'; import { ActivatedRoute } from '@angular/router'; import { MyObj } from 'src/app/pojo/myObj'; @Component({ selector: 'app-work', templateUrl: './work.component.html', styleUrls: ['./work.component.cs

TypeScript——接口

接口的作用就是为这些类型命名和为你的代码或第三方代码定义契约(规范对象的属性 属性的类型 属性值的类型) 可选属性 通过 ? 来设置 只读属性 通过 readonly 来设置 对象类型接口 interface List { readonly id: number; // 只读属性 name: string; age?: number; // 可选属性 } interface Result { data: List[] } function render(result: Result) { res

TypeScript入门五:TypeScript的接口

TypeScript接口的基本使用 TypeScript函数类型接口 TypeScript可索引类型接口 TypeScript类类型接口 TypeScript接口与继承 一.TypeScript接口的基本使用 1.1定义TypeScript接口的指令(interface) 接口让我们想到的第一个短语就是(API).比如日常我们所说的调用某某程序的API一般都是跨应用的接口,如别的网站的或者APP的接口:还有我们每天都是用的编程语言的指令和内置的方法及属性,这些可以叫做编程语言的接口:还有令我们既