前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >typescript入门-高级类型

typescript入门-高级类型

作者头像
copy_left
发布2021-06-11 18:12:36
2550
发布2021-06-11 18:12:36
举报
文章被收录于专栏:方球

交叉类型

代码语言:javascript
复制
交叉类型是将多个类型合并为一个类型

interface Man{
  name:string
}
interface Job{
  position:string
}
type clerk = Man & Job


const c:clerk = {
  name: 'x',
  position: 'x'
}

联合类型

联合类型表示一个值可以是几种类型之一

代码语言:javascript
复制
type status = string | number
const c:status = 0
const b:status = 'x'
  • 只能访问此联合类型的所有类型里共有的成员
代码语言:javascript
复制
interface A{
  name:string
  count:number
}
interface B{
  name:string
  color:string
}
type C = A | B
const c:C = { name:'xx', count: 10 }
console.log(c.name) // okay
console.log(c.count) // error

类型区分

通过类型区分,确定联合类型的具体类型

  • 属性判断
代码语言:javascript
复制
let pet = getSmallPet();


// 每一个成员访问都会报错
if (pet.swim) {
    pet.swim();
}
else if (pet.fly) {
    pet.fly();
}
  • 断言
代码语言:javascript
复制
let pet = getSmallPet();


if ((<Fish>pet).swim) {
    (<Fish>pet).swim();
}
else {
    (<Bird>pet).fly();
}

类型保护

类型保护就是一些表达式,它们会在运行时检查以确保在某个作用域里的类型。 既是通过一次类型判断,值在当前作用域下类型为确定值

  • 函数类型保护

返回类型谓词 的断言函数

代码语言:javascript
复制
function isFish(pet: Fish | Bird): pet is Fish {
    return (<Fish>pet).swim !== undefined;
}
  • typeof 类型保护
代码语言:javascript
复制
function padLeft(value: string, padding: string | number) {
    if (typeof padding === "number") { // 通过 typeof 明确值类型
        return Array(padding + 1).join(" ") + value;
    }
    if (typeof padding === "string") {
        return padding + value;
    }
    throw new Error(`Expected string or number, got '${padding}'.`);
}
  • instanceof 类型保护
代码语言:javascript
复制
interface Padder {
    getPaddingString(): string
}


class SpaceRepeatingPadder implements Padder {
    constructor(private numSpaces: number) { }
    getPaddingString() {
        return Array(this.numSpaces + 1).join(" ");
    }
}


class StringPadder implements Padder {
    constructor(private value: string) { }
    getPaddingString() {
        return this.value;
    }
}


function getRandomPadder() {
    return Math.random() < 0.5 ?
        new SpaceRepeatingPadder(4) :
        new StringPadder("  ");
}


// 类型为SpaceRepeatingPadder | StringPadder
let padder: Padder = getRandomPadder();


if (padder instanceof SpaceRepeatingPadder) {
    padder; // 类型细化为'SpaceRepeatingPadder'
}
if (padder instanceof StringPadder) {
    padder; // 类型细化为'StringPadder'
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 交叉类型
  • 联合类型
  • 类型区分
  • 类型保护
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档