美文网首页
联合类型,对象的类型——接口

联合类型,对象的类型——接口

作者: 不落05 | 来源:发表于2023-05-12 18:15 被阅读0次

联合类型(Union Types)表示取值可以为多种类型中的一种,只能是其中的一种。

let myFavoriteNumber: string | number;
myFavoriteNumber = 'seven';
myFavoriteNumber = 7;

访问联合类型的属性或方法

当 TypeScript 不确定一个联合类型的变量到底是哪个类型的时候,我们只能访问此联合类型的所有类型里共有的属性或方法

function getLength(something: string | number): number {
    return something.length;
}

// index.ts(2,22): error TS2339: Property 'length' does not exist on type 'string | number'.
//   Property 'length' does not exist on type 'number'.
 
function getLength(something: string | number): number {
    return something.toString();
}

类型别名

type Name = string;
type NameResolver = () => string;
type NameOrResolver = Name | NameResolver;
function getName(n: NameOrResolver): Name {
    if (typeof n === 'string') {
        return n;
    } else {
        return n();
    }
}

字符串字面量类型

字符串字面量类型用来约束取值只能是某几个字符串中的一个。

type EventNames = 'click' | 'scroll' | 'mousemove';
function handleEvent(ele: Element, event: EventNames) {
    // do something
}

handleEvent(document.getElementById('hello'), 'scroll');  // 没问题
handleEvent(document.getElementById('world'), 'dblclick'); // 报错,event 不能为 'dblclick'


// 数字也可以
type Nums = 1 | 2 | 3;

接口

在 TypeScript 中,我们使用接口(Interfaces)来定义对象的类型。
在面向对象语言中,接口(Interfaces)是一个很重要的概念,它是对行为的抽象,而具体如何行动需要由类(classes)去实现(implement)。

TypeScript 中的接口是一个非常灵活的概念,除了可用于对类的一部分行为进行抽象以外,也常用于对「对象的形状(Shape)」进行描述。
常见:

interface Person {
    name: string;
    age: number;
}

let tom: Person = {
    name: 'Tom',
    age: 25
};

接口一般首字母大写,定义的变量比接口少了一些属性是不允许的,多一些属性也是不允许的,赋值的时候,变量的形状必须和接口的形状保持一致

可选属性

此时用可用可选属性

interface Person {
    name: string;
    age?: number;
}

此时age参数可选,但是仍然不允许添加未定义的属性。

任意属性

还可设置任意属性如下方式:

interface Person {
    name: string;
    age?: number;
    [propName: string]: any;
}

let tom: Person = {
    name: 'Tom',
    gender: 'male'
};

需要注意的是,一旦定义了任意属性,那么确定属性和可选属性的类型都必须是它的类型的子集

interface Person {
    name: string;
    age?: number;
    [propName: string]: string;
}

let tom: Person = {
    name: 'Tom',
    age: 25,
    gender: 'male'
};

此时可选的age只能是string类型,[propName: string]: 可使用联合声明或者any。
一个接口中只能定义一个任意属性

只读属性

有时候我们希望对象中的一些字段只能在创建的时候被赋值,那么可以用 readonly 定义只读属性:

interface Person {
    readonly id: number;
    name: string;
    age?: number;
    [propName: string]: any;
}

let tom: Person = {
    id: 89757,
    name: 'Tom',
    gender: 'male'
};

tom.id = 9527;

注意,只读的约束存在于第一次给对象赋值的时候,而不是第一次给只读属性赋值的时候

相关文章

  • T extends object + keyof 组合

    keyof 关键字 keyof 表示获取一个:类或者对象类型 或者接口类型的,所有属性名[key]组成的联合类型 ...

  • TS之对象的类型 — 接口

    上一篇介绍了联合类型,今儿接着介绍对象类型。 在 TypeScript 中,我们使用接口(Interface)来定...

  • TypeScript06(类型断言 | 联合类型 | 交叉类型)

    联合类型 函数使用联合类型 交叉类型 多种类型的集合,联合对象将具有所联合类型的所有成员 类型断言 语法:值 as...

  • TS中type和interface类型守卫

    接口 通用函数类型 联合类型 联合类型技巧性使用场景 type 和 interface 区别 区别1: 定义类型范...

  • Typescript

    安装 Typescript 接口 interface 约束类型结构、Duck Typing 类型推论、联合类型、类...

  • TS 联合类型和交叉类型

    联合类型 通过 | 将变量设置多种类型,赋值时可以根据设置的类型来赋值。举例说明: 联合基础类型 联合对象类型 可...

  • ts接口 interface

    概念:可以用来约束一个函数,对象,以及类的结构和类型 1.对象类型的接口 2.函数类型的接口 3.混合类型的接口(...

  • 学习TypeScript 接口

    TypeScript 接口定义 interface interface_name {} 实例 联合类型和接口 接口...

  • Typescript - 基础(三)

    接口、函数、类 1、接口 作用:可以用来约束函数、对象以及类的结构和类型。 1.1 对象类型的接口 考虑其他情况:...

  • typeScript语法

    ts类型 ts联合类型使用或 ts定义任意类型any ts定义函数返回值的类型 ts中的类定义 interface接口

网友评论

      本文标题:联合类型,对象的类型——接口

      本文链接:https://www.haomeiwen.com/subject/aforsdtx.html