typescript互斥类型判断


theme: hydrogen

情景: 有个Card组件 需要接受2d或者3d的参数 但是不知道里面的属性是有没有定义的

image.png

?可不可以 (失败)

interface I2dcard {
    x: number
    y: number
}
interface I3dcard {
    x: number
    y: number
    z: number
    isThreedcard: true
}

type CardProps = I2dcard | I3dcard


function Card(props: CardProps) {
   
    if (props?.isThreedcard) {
        //TO DO
    }
    return {
        //Jsx
    }
}

image.png

不理想做法(可以)

interface I2dcard {
    x: number
    y: number
}
interface I3dcard {
    x: number
    y: number
    z: number
    isThreedcard: true
}

type CardProps = I2dcard | I3dcard


function Card(props: CardProps) {
    const { x, y, z } = props
    if (z) {
        //TO DO
    }
    return {
        //Jsx
    }
}

要是3d里面多了很多其他属性一个个判断太麻烦了

官网给出答案

ts官网:https://www.typescriptlang.org/

https://www.typescriptlang.org/docs/handbook/2/narrowing.html#using-type-predicates

在 Using type predicates 那一块

案例:

type Fish = { swim: () => void };
type Bird = { fly: () => void };
declare function getSmallPet(): Fish | Bird;
// ---cut---
function isFish(pet: Fish | Bird): pet is Fish {
  return (pet as Fish).swim !== undefined;
}

在这里插入图片描述

resolve

interface I2dcard {
    x: number
    y: number
}
interface I3dcard {
    x: number
    y: number
    z: number
    isThreedcard: true
}

type CardProps = I2dcard | I3dcard

function isThreedCard(card: CardProps): card is I3dcard {
    return (card as I3dcard).z !== undefined;
}
function Card(props: CardProps) {
    const is3dCard = isThreedCard(props)
    if (is3dCard) {
        const { z } = props
    } else {
        const { x, y } = props
    }
    return {
      //Jsx
    }
}

代码demo测试

demo

  • 6
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
TypeScript中,有几种方法可以用来判断类型。其中一种方法是使用typeof操作符。通过typeof v === "typename"或typeof v !== "typename"的形式,可以判断一个变量的类型是否为"number","string","boolean"或"symbol"等。但是需要注意的是,TypeScript并不会阻止你与其他字符串进行比较,这些表达式不会被识别为类型保护。\[1\] 另一种方法是使用instanceof关键字。通过使用instanceof关键字,可以判断一个对象是否属于某个类或接口的实例。例如,在一个泛型函数中,可以使用extends关键字约束泛型类型T必须是某个对象类型的子类型,然后使用keyof操作符获取T类型的所有键,最后使用extends关键字约束K类型必须是keyof T联合类型的子类型。这样就可以在函数中使用obj\[key\]来获取对象的属性值。\[2\] 此外,TypeScript还提供了联合类型的概念。联合类型允许一个变量具有多种可能的类型。例如,可以使用string | boolean来声明一个变量,该变量可以是字符串类型或布尔类型。\[3\] 综上所述,TypeScript提供了多种方法来判断类型,包括typeof操作符、instanceof关键字和联合类型。这些方法可以根据具体的需求来选择使用。 #### 引用[.reference_title] - *1* *3* [TypeScript 类型检查总结](https://blog.csdn.net/m0_45406092/article/details/106854643)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [typescript类型判断](https://blog.csdn.net/meng16/article/details/111404848)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值