typescript-类型别名

typescript-类型别名

类型别名声明

类型别名声明能够定义一个类型别名type AliasName = Type

type Point = {x: number; y: number}
type StringType = string;
type BooleanType = true | false
type Point = {x: number; y: number; z?: number}

类型别名不会创建出一种新的类型,是给已有的类型别名并直接引用该类型。

递归的类型别名

一般情况下,在类型别名声明种赋值运算符右侧的类型不允许引用当前定义的类型别名,因为类型别名对其引用的类型使用的是及早求值的策略,而不是惰性求值的策略。

type T = T// 编译错误,类型别名中t存在循环的自身引用
  1. 类型别名引用的类型为接口类型,对象类型字面量,函数类型字面量和构造函数字面量,允许递归引用类型别名
type T0 = {name: T0}
type T1 = () => T1;
type T2 = new () => T2
  1. 若类型别名引用的是数组类型或者元组类型,允许在元素类型中递归的引用类型别名
type T0 = Array<T0>
type T1 = T1{}
type T3 = [number, T3]
  1. 若类型别名引用的是泛型类或泛型接口,则允许在类型参数中递归的引用类型别名
interface A<T> {
    name: T
}
type T0 = A<T0>
class B<T> {
    name: T|undefined
}
type T1 = B<T1>

通过递归的类型别名能够定义一些特别常用的类型。

type Json = 
    |string
    |number
    |boolean
    |null
    | {[property: string]: Json}
    | Json[]
const data: Json = {
    name: 'Typescirpt',
    version: {major: 3}
}

类型别名与接口

类型别名和接口类型,但是可以给类型别名通过改名字来引用表示的类型,虽然在大部分的场景中是可以互换使用的,但是类型别名和接口之间还是存在一定的差别
类型别名可以表示非对象类型,而接口只能表示对象类型,当需要表示原始类型,联合类型和交叉类型等类型的时候只能使用类型别名

type NumbericType = number | bigint

接口可以继承其他的接口,类等对象类型,而类型别名不支持继承

interface Shape {
    name: string
}
interface Circle extends Shape {
    radius: number
}

若要对类型别名实现类似继承的功能,需要使用一些变通的方法

type Shape = {name: string}
type Circle = Shape & {radius: number}
function foo(circle: Circle) {
    const name = circle.name
    const radius = circle.radius
}

此类型中的方法只适用于对象类型的类型别名,如果类型别名表示非对象,无法使用该方法。
只有当类型别名表示数组类型,元组类型以及类或接口的泛型示例时,才会在相关信息中提示类型别名的名字。
接口具有声明合并的行为,而类型别名不会进行声明合并

  • 9
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值