TS-类型兼容性

  • 基本类型,完全匹配才可以被赋值。

  • 函数类型,参数可以少传不能多传,返回值要求返回则必须返回,不要求返回,返回了也不报错。

  • 对象类型,有些特殊的要求。

下面介绍下对象类型的类型兼容性:

1,它是鸭子吗

“当看到一只鸟走起来像鸭子、游起来像鸭子、叫起来也像鸭子,那么这只鸟就可以被称为鸭子。”

所以有一个鸭子分辨法

如果 B 能赋值给 A(A = B),则 B 的类型 typeB 兼容 A 的类型 typeA

也就是说,目标(鸭子)类型 typeA 需要一些特征,赋值类型 typeB 只要能满足即可。

举例:

interface Duck {
    sound: "嘎嘎";
    canSwim: Boolean;
}

let user = {
    name: "伪装成鸭子",
    age: 12,
    sound: "嘎嘎" as "嘎嘎",
    canSwim: true,
};

let duck: Duck = user;

注意点1

sound: "嘎嘎" as "嘎嘎", 为什么要这样写?

因为在接口中 sound 字段就是用 "嘎嘎" 这个确定的字面量类型来约束的。所以在使用该接口时,sound 只能赋值为它。

但是在使用时,对 sound 的赋值会被推断为 string 类型,所以要用类型断言 as 来告诉 ts 它的类型

在这里插入图片描述

所以,如果 canSwim 像下面这样定义,则使用时也得这样:canSwim: true as true

interface Duck {
    sound: "嘎嘎";
    canSwim: true;
}

注意点2

看起来变量 duck 现在有4个属性,但只能使用接口 Duck 约束的2个字段。

console.log(duck.sound);
// 报错 Property 'name' does not exist on type 'Duck'.ts(2339)
console.log(duck.name);

注意点3

直接使用对象字面量赋值,会触发 ts 更加严格的类型检查。

let duck: Duck = {
    // Object literal may only specify known properties, and 'name' does not exist in type 'Duck'.ts(2353)
    name: "伪装成鸭子",
    age: 12,
    sound: "嘎嘎" as "嘎嘎",
    canSwim: true,
};

那为什么下面这样就可以呢?

let user = {
    name: "伪装成鸭子",
    age: 12,
    sound: "嘎嘎" as "嘎嘎",
    canSwim: true,
};

let duck: Duck = user;

首先,一般情况下不会这样多此一举,但 user 如果是一个函数执行的返回值,并且函数传参不同返回值就不同, ts 会考虑这样的情况。

换句话说,既然直接使用对象字面量赋值,那说明 每个字段都是确认的,所以得严格一点。

function getUser() {
    return {
        name: "伪装成鸭子",
        age: 12,
        sound: "嘎嘎" as "嘎嘎",
        canSwim: true,
    };
}

let duck: Duck = getUser();

也可以使用类型断言来规避这个错误

let duck: Duck = {
    name: "伪装成鸭子",
    age: 12,
    sound: "嘎嘎" as "嘎嘎",
    canSwim: true as true,
} as Duck;

// 或
let duck: Duck = <Duck>{
    name: "伪装成鸭子",
    age: 12,
    sound: "嘎嘎" as "嘎嘎",
    canSwim: true as true,
}

2,实际应用

注意点 2 是一个关键点。

举例:接口返回字段有很多,我们只需要其中的几个。如果使用接口中没有定义的字段,就会报错!

interface User {
    nickname: string;
    id: string;
}

const responseUser = {
    nickname: "xx",
    id: "fafd12312",
    age: 18,
    // ...
};

let user: User = responseUser;

console.log(user.nickname);
// Property 'age' does not exist on type 'User'.ts(2339)
console.log(user.age);

类的继承同理

class User {
    name: string = ''
    age: number = 18
}

class AdminUser extends User {
    role: string = '123'
}

// 因为约束为 User,所以不能使用 role 属性。
const admin: User = new AdminUser()

扑克牌练习中,也用到了这个特性。


以上。

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: nfcforum-ts-digital-2.2是指NFC Forum关于数字产品的技术规范。NFC(Near Field Communication)即近场通讯,是一种短距离无线通信技术,能够实现设备之间的数据传输和交互。 NFC Forum是一个国际组织,旨在推动NFC技术的发展和应用。他们发布了一系列的技术规范,以指导和规范NFC设备和应用的开发和使用。nfcforum-ts-digital-2.2是其中之一,它涵盖了数字产品与NFC的相关技术要求和操作规范。 在nfcforum-ts-digital-2.2中,包含了一些重要的内容。首先,它规定了数字产品与NFC设备进行交互时的数据格式和协议。这样一来,不同厂商开发的NFC设备能够更好地兼容不同的数字产品,并实现数据的准确传输与交流。 其次,nfcforum-ts-digital-2.2还规定了数字产品在与NFC设备交互时需要满足的安全要求。数字产品通常涉及个人敏感信息和金融交易等重要内容,所以确保交互过程的安全性十分重要。这一规范确保了数字产品能够通过NFC技术进行安全的数据传输和交互。 此外,nfcforum-ts-digital-2.2还包含了关于数字产品与NFC设备之间的电力传输和功耗管理的要求。这是为了减少数字产品对NFC设备电力资源的消耗,提高设备的续航能力,并确保数字产品能够在不充电的情况下与NFC设备正常工作。 总而言之,nfcforum-ts-digital-2.2是NFC Forum发布的一项针对数字产品的技术规范。它主要关注数字产品与NFC设备之间的数据传输、安全性和功耗管理等方面的要求。遵循这一规范将有助于推动NFC技术与数字产品的融合发展,提供更便捷、安全和高效的用户体验。 ### 回答2: NFC Forum TS Digital 2.2 是NFC论坛发布的技术规范文件。NFC(Near Field Communication)是一种近场通讯技术,允许设备之间无线进行数据传输和交互。 NFC Forum TS Digital 2.2 的主要目的是提供一套标准的数据格式和协议,以支持数字内容在NFC设备之间的互相传输。这些内容可以是数字音频、视频、图像、地理位置信息等等。 NFC Forum TS Digital 2.2 针对数字内容传输定义了一些基本要素,其中包括了数据格式、编码方式、传输协议和安全机制等。通过遵循这些规范,不同类型的NFC设备可以在互相兼容的基础上进行数字内容的交互和共享。 NFC Forum TS Digital 2.2 的应用场景广泛,例如在零售业中,通过NFC技术,消费者可以使用自己的手机或其他NFC设备与商家的POS终端进行交互,完成支付、领取优惠券等操作。在电子票务领域,乘客可以使用NFC设备获取电子票,通过NFC技术进行验证进出站等。此外,NFC论坛还鼓励开发者使用NFC技术构建更多创新的应用,例如智能家居、智能健康监测等等。 总之,NFC Forum TS Digital 2.2 是针对数字内容在NFC设备间传输的一项技术规范,通过制定统一的标准,确保不同设备间的互通性,并且为各行各业提供了广泛的应用可能性。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

下雪天的夏风

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值