[TypeScript] - TypeScript官方文档学习笔记-接口-上(二)

前言

接口只是在语法层面限制写法,从而使部分语句写法不出现,本质是语法规范

接口

TypeScript中接口用来定义结构类型,出于类型检查需要

编译转换后接口消失,仅用于语法检查

普通对象传入:

function printLabel(labeledObj: { label: string }) {
    console.log(labeledObj.label);
}

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

注意:传入的对象中有额外属性

通过接口:

interface LabeledValue {
    label: string;
}

function printLabel(labeledObj: LabeledValue) {
    console.log(labeledObj.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.color) {
        newSquare.color = config.color;
    }
    if (config.width) {
        newSquare.area = config.width * config.width;
    }
    return newSquare;
}

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

只读属性

在属性名称前加readonly修饰符

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

只读数组

ReadonlyArray<T>,像用Array<T>那样,但不可改变

let a: number[] = [1, 2, 3, 4];
let ro: ReadonlyArray<number> = a;
//let ro: ReadonlyArray<number> = [1,2,3,4];
ro[0] = 12; // error!
ro.push(5); // error!
ro.length = 100; // error!
a = ro; // error!

将只读数组赋给对象也是非法的

可以通过类型断言将可读数组赋给其它变量

let ar :ReadonlyArray<number> = [1,2,3,4]
let b = ar as number[]

readonly vs const

  • 属性用readonly(语法限制)
  • 变量用const(编译限制)

额外属性检查

如果提供的对象没有一个是接口(或普通对象写法)中包含的,TS语法检查会报一个错误

这个错误可能是因为拼写错误(显示错误主要目的是这个),或就是这样

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

function createSquare(config: SquareConfig): { color: string; area: number } {
    return {color: 'red',area: 23}
}

let mySquare = createSquare({ colour: "red", width: 100 });// Error

解决方法:断言

let mySquare = createSquare({ colour: "red", width: 100 } as SquareConfig);

允许额外属性

若要在方法中使用额外属性,可以在接口中添加[propName: string]: any;

interface SquareConfig {
    color?: string;
    width?: number;
    [propName: string]: any;
}

通过变量

通过将对象赋给变量来绕过检查(至少需要一个共同属性)

let squareOptions = { colour: "red", width: 100 };
let mySquare = createSquare(squareOptions);

大多数时候多余属性是错误的存在

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值