typescript --object对象类型

ts中的object

const obj = new Object()

Object

这里的Object是Object类型,而不是JavaScript内置的Object构造函数。
这里的Object是一种类型,而Object()构造函数表示一个值。
Object()构造函数的ts代码

interface ObjectConstructor{
	readonly prototype: Object
	// 忽略了其他成员
}
declare var Object: ObjectConstructor

Object类型是特殊对象Object.prototype的类型,该类型主要是描述JavaScript中几乎所有对象都共享(通过原型链继承)的属性和方法。

类型兼容性

除了undefined和null外,其他任何值都可以赋值给Object类型

let obj: Object;
obj = {x: 0}
obj = true
obj = "hi"
obj = 1
obj = undefined
obj = null

常见错误

const point: Object = {x: 0, y: 0}  //不应该使用Object类型,而是应该使用object类型来代替

object

object表示非原始类型。

const ponit: object = {x: 0, y: 0}

强调的是一个非原始的类型,即对象类型,不关注对象类型中的属性

const obj: object = {foo: 0}
obj.foo// 编译错误,foo不存在于类型object上
obj.foo// 编译错误,foo不存在于类型object上

类型兼容性

javascript中的数据类型中可以划分为原始数据类型和对象数据类型两大类。
object类型仅能赋值给下面三种类型

  1. 顶端类型any和unknown
  2. Object类型
  3. 空对象类型字面量"{}"
const nonPrimitive:object = {}
const a: any = nonPrimitive
const b: unknown = nonPrimitive

Object类型描述了所有对象都能共享的属性和方法,很自然的表示对象类型的object能够赋值给Object。

const nonPrimitive: object = {}
const obj: Object = nonPrimitive

object类型能够赋值给空对象{}

const nonPrimitive: object = {}
const obj: {} = nonPrimitive

实例应用

Object.create()该方法必须传入对象或者null值作为新创建对象的原型。

const a = Object.create(Object.prototype)
const b = Object.create(null)
// 类型错误
const c = Object.create(1)

对象类型字面量

对象类型字面量是定义对象类型的方法之一。

const point: {x: number, y: number} = {x: 0, y: 0}

基础语法

{
	TypeMember;
	TypeMember;
	...
}
{
	TypeMember,
	TypeMember,
	...
}
属性签名
{
	PropertyName: Type;
}
let point : {x: number, y: number} = {x: 0, y: 0}

属性签名中的属性名可以为可计算属性名,但是条件如下

  1. 可计算属性名的类型为string字面量类型或者number字面量类型
  2. 可计算属性名的类型为"unique symbol"类型。
  3. 可计算属性名"Symbol.xxx"的形式
  4. 允许只列出属性名而不定义任何类型。在这种情况下,该属性的类型默认为any类型(启用–noImplicitAny 编译类型)
const a: 'a' = 'a'
const b: 0 = 0;
let obj: {
	[a]: boolean;
	[b]: boolean;
	['c']: boolean;
	[1]: boolean
}
const s: unqiue symbol = Symbol()
let obj: {
	[s]: boolean
}
let obj: {
	[Symbol.toStringTag]: string;
}
{
	x;
	y;
}
{
	x:any;
	y:any;
}
可选属性
{
	PropertyName?: Type
}
{
	let point: {x: number; y: number; z?: number}
}
point = {x: 0, y: 0}
point = {x: 0, y: 0, z: 0}

只读属性

只读属性的值在初始化后不允许再被修改

let point: {
	readonly x: number;
	readonly y: number
}
point = {x: 0, y: 0}

空对象类型字面量

const point: {} = {x: 0, y: 0}
point.x // 编译错误,x不存在于类型{}
point.y // 编译错误,y不存在于类型{}
point.valueOf()
let a: Object = 'hi'
let b: {} = 'hi'
a = b
b = a

全局的Object类型用于描述对象公共的属性和方法,它相当于一种专用类型,因此程序中不应该将自定义变量、参数等类型直接声明为Object类型。空对象类型字面量“{}”强调的是不包含属性的对象类型,同时也可以作为0bject类型的代理来使用

弱类型

  1. 对象类型中至少包含一个属性
  2. 对象类型中所有属性都可以是可选属性
  3. 对象类型中不包含字符串索引签名,数值索引签名,调用索引签名和构造签名
let config: {
    url?: string;
    async?: boolean;
    timeout?: number
}

多余属性

多余属性会对类型间的判定产生影响。 只有在比较两个对象类型的关系的时候,讨论多余属性,才会有意义。
讨论源对象类型和目标对象类型,两个对象类型,当满足下面的条件,源对象类型相对于目标对象类型存在多余属性。

  1. 源对象类型是一个全新的对象字面量类型
  2. 源对象类型中存在一个或者多个在目标对象类型中不存在的属性。
const point: {x?: number; y?: number} = {
    x: 0,
    y: 0,
    z: 0, // z是多余属性
}
const point: {x: number; y: number} = {
    x: 0,
    y: 0,
    z: 0, // z是多余属性
}
多余属性检查

编译器会出现多余属性错误。多余属性在绝大多数的场景是合理的。
使用类型断言。类型断言能够绕过多余属性检查的真正原因,处于类型断言表达式中的对象字面量不再是全新的对象字面量。

const p0: {x: number} = {x: 0, y: 0} as {x: number}
const p1: {x: number} = {x: 0, y: 0} as {x: 0, y: 0}

函数类型

常规参数类型
function add(x: number, y: number) {
    return x + y
}
const f = function(x: number, y: number) {
    return x + y
}
const f = function(x, y) {
    return x + y
}
// 等价于
const f = function(x: any, y: any) {
    return x + y
}
可选参数类型
function add(x: number, y?: number) {
    return x + (y ?? 0)
}
function add(x: number, y?: number, z?: number) {
    return x + (y ?? 0) + (z ?? 0 )
}
// 必选参数不可以出现在可选参数的后面
function add(x?: number, y: number) {  // error 
    // code 
}
默认参数类型
function add(x: number = 0, y = 0) {
    return x + y
}
function add(x: number, y: number = 0) {
    return x + y
}
剩余参数类型
function f(...args: number[]) {}
元组类型的剩余参数

剩余参数的类型可以定义为元组类型,下列剩余参数的类型,分为两个元素怒的元组类型

function f(...args: [boolean, number] ){}
  1. 常规元组类型
     function f0(...args: [boolean, number]) {}
     function f1(args_0: boolean, args_1: number){}
    
  2. 常规可选元素的元组类型
     function f0(...args: [boolean, string?]){}
     function f1(args_0: boolean, args1?: string) {}
    
  3. 带有剩余元素的元组类型
    function f0(...args: [boolean, ...string[]]) {}
    function f1(args_0:boolean, ...args1:string[]) {}
    
结构参数类型
function f0([x, y]) {}
function f1({x, y}) {}
function f0([x,y]: [number, number]){}
function f1({x, y}: {x:number, y: number})
返回值类型
函数类型字面量

语法: (ParameterList) => Type

let f: () => void 
f = function() {}
let add: (x: number, y: number) => number;
let k : (x: number) => number;
k = function(y: number) : number {
    return y
}
调用签名

ParameterList表示函数形式参数列表类型,type表示函数返回值类型{(ParameterList): Type}

const abs0: (x: number ) => number = Math.abs;
const abs1: {(x:number):number} = Math.abs;
构造函数类型字面量

语法: new (ParameterList) => Type

let ErrorConstructor: new (message?: string) => Error
构造签名

语法: {new (ParameterList): Type} 或者简写: new (ParameterList) => Type

let Dog: {new (name: string): object}
Dog = class {
    private name: string;
    constructor(name: string) {
        this.name = name 
    }
}
调用签名和构造函数

示例

{
    new (x: number) : Number // 构造签名
    (x: number) :number // 调用签名
}

declare const F:{
    new (x: number) : Number;
    (x: number): number
}
const a: number = F(2)
const b: Number = new F(1)
重载函数
function add(x:number, y:number):number
function add(x:any[], y:any[]):any[]
if (typeof x=== 'number' && typeof y === 'number') {
    return x + y
}
if (Array.isArray(x) && Array.isArray(y)) {
    return [...x, ...y]
}    
函数重载

不带有函数体的函数声明叫做函数重载

function add(x: number, y: number) :number

函数重载只提供了函数的类型信息,函数重载只存在于代码编译阶段,在编译生成JavaScript代码时候会被完全删除。
函数重载允许存在一个或者多个,但是只有多余一个的函数重载才有意义。如果只有一个函数重载,可以直接用定义函数来实现。多个函数重载语句之间以及函数重载语句与函数实现语句之间,不允许出钱其他的语句。

function add(x:number, y: number) : number ;
function add(x:any[], y:any[]):any[]
function add(x:number | any[], y:number |any[]):any{}
函数实现

函数实现中的函数签名不属于重载函数的调用签名之一,只有函数重载中的函数签名能够作为重载函数的调用签名。例如,下例中的add函数只有两个调用签名,分别为第1行与第2行定义的两个重载签名,而第3行函数实现中的函数签名不是add函数的调用签名

 function add(x: number, y: number): number;
 function add(x: any[], y: any[]): any[];
 function add(x: number | any[], y: number | any[]):
 {
  // 省略了实现代码
 }
函数重载解析顺序

当程序中调用了一个重载函数的时候,编译器将构造出一个候选函数重载列表,一个函数重载需要满足如下条件才能称为本次的函数调用候选重载

  1. 函数实际参数的数量不少于函数重载中定义的必选参数的数量
  2. 函数实际参数的数量不多于函数重载中定义的参数的数量
  3. 每个实际参数的类型都能够赋值给函数重载定义中对应形式参数的类型。
    在开发中,编写函数重载代码的时候需要将精确的函数定义到最前面,定义的顺序会影响函数调用签名的选择
    在这里插入图片描述

在这里插入图片描述

函数中this的值

默认情况下,编译器会将函数中的this值设置为any类型,允许程序在this的值上进行任意的操作。
typescript还允许在函数形式参数列表中定义一个特殊的this参数用来描述函数中this的值。this参数不用于常规的函数形式参数,只存在于编译阶段,在编译生成的JavaScript代码中被完全删除。

function foo(this: {bar: string}, baz:number) {
    // ...
}
foo(0);//错误
foo.call({bar:'hello'}, 0)// 正确

调用foo函数的瘦指定了this的值,其类型符合this参数的类型定义,不会缠身错误。Function.prototype.call()方法是JavaScript的内置方法,能够指定调用函数使用的this值。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/672385.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【JavaEE】JVM中垃圾回收机制详解

一.垃圾回收的基本概念 1.什么是垃圾回收机制. JVM(Java虚拟机)垃圾回收机制是Java内存管理的重要组成部分,它负责自动回收程序中不再使用的对象所占用的内存空间。这样可以有效地防止内存泄漏和内存溢出问题,提高程序的稳定性和…

电脑死机问题排查

情况描述:2024年6月2日下午16:04分电脑突然花屏死机,此情况之前遇到过三次,认为是腾讯会议录屏和系统自带录屏软件冲突导致。 报错信息:应用程序-特定 权限设置并未向在应用程序容器 不可用 SID (不可用)中运行的地址…

GPT-4o有点坑

GPT-4o有点坑 0. 前言1. GPT-4o简介2. GPT-4o带来的好处2.1 可以上传图片和文件2.2 更丰富的功能以及插件 3. "坑"的地方3.1 使用时间短3.2 GPT-4o变懒了 4. 总结 0. 前言 原本不想对GPT-4o的内容来进行评论的,但是看了相关的评论一直在说:技…

全国水系数据(更新到2024年5月)

上海市水系数据地图可视化 水系数据线图层(小河/溪流、江/河、运河、下水道/排水管) 水系数据面数据(水域、水库、河岸、湿地) 水系数据字段说明 可视化预览 北京市水系可视化 上海市水系可视化 广州市水系可视化 深圳市水系可视化…

Gin的快速入门和搭建

文章目录 Go的工程工程架构技术选型 Gin入门 Go的工程 基于Go生态,构建一个支持内容管理,内容加工、内容分发的内容库系统。 内容管理:增删改查内容加工:例如内容审核、推荐等内容分发:将内容可以推到不同的业务线 …

用例篇03

正交表 因素:存在的条件 水平:因素的取值 最简单的正交表:L4(2) 应用 allpairs 来实现正交表。 步骤: 1.根据需求找出因素和水平 2.将因素和水平写入到excel表格中(表格不需要保存)(推荐用…

集成学习算法笔记

一、引言 在机器学习和数据分析领域,集成学习算法因其能够显著提高模型预测性能而备受关注。然而,任何算法在应用过程中都不可避免地会遇到一些挑战和问题,集成学习算法也不例外。其中,最为常见且关键的两大问题便是欠拟合&#…

软考高级系统规划与管理师适合什么人考?有什么优势?

系统规划与管理师适合什么人考? 适合以下几类人群: 1. 信息技术服务规划人员:从事信息技术服务规划工作,负责制定和优化IT服务规划的人 2. 信息系统运行维护管理人员:负责信息系统日常运行维护、确保系统稳定性和可…

【Pr剪辑】01新建项目起步

【Pr学习】01新建项目起步 1、新建项目2.序列设置2.1新建序列2.2序列参数讲解2.3自定义设置 3.PR窗口认识3.1 项目窗口3.2 源窗口2.4 保存面板 4.剪辑导入4.1 素材导入4.2 视图切换4.3 时间轴4.4轨道工具4.5 节目窗口素材导入 5.基础操作5.1 取消视频音频链接5.2 单独渲染&…

网络监听技术

网络监听技术 网络监听概述网络监听环境 流量劫持网络环境共享式网络监听原理交换式网络监听交换机的工作方式交换网络监听:交换机集线器交换网络监听:端口镜像交换网络监听:MAC洪泛交换网络监听:MAC洪泛交换网络监听:…

OpenMV学习笔记3——画图函数汇总

画图,即在摄像头对应位置画出图形,对于需要反馈信息的程序来说很直观。就如上一篇文章颜色识别当中的例子一样,我们在识别出的色块上画出矩形方框,并在中间标出十字,可以直观的看到OpenMV现在识别出的色块。 目录 一…

《论文阅读》通过顺序不敏感的表示正则化实现稳健的个性化对话生成 ACL 2023

《论文阅读》通过顺序不敏感的表示正则化实现稳健的个性化对话生成 ACL 2023 前言 相关个性化生成论文推荐简介问题定义方法损失函数实验结果 前言 亲身阅读感受分享,细节画图解释,再也不用担心看不懂论文啦~ 无抄袭,无复制,纯手…

Least-Squares Rigid Motion Using SVD——文献精读(使用 SVD 方法求解 ICP 问题)

一、文章信息与摘要 文章标题:Least-Squares Rigid Motion Using SVD(使用奇异值分解的最小二乘刚性运动) 说明本文的核心目标:计算对齐两组对应点的最佳拟合刚性变换的步骤 二、问题描述 假设P{p1,p2,...,pn}和Q{q1,q2,...,qn…

以sqlilabs靶场为例,讲解SQL注入攻击原理【25-31关】

【Less-25】 首先分析源码 发现把 SQL语句中的 or、and 替换成了空格,这就导致无法使用之前的sql注入方式。 解决方案:用 && 代替 and , 用 || 代替 or , 而且&在url中有特殊含义,如果直接使用会有问题&a…

电磁兼容(EMC):BUCK变换器基本原理及传导辐射分析设计

目录 1. BUCK电路拓扑及原理 2. Buck拓扑电路电磁场分析 3.总结 开关电源替代线性电源,解决了效率和体积问题,但也带来了新的EMI问题。开关电源也是产品内部的强辐射源之一,基于透过现象看本质,将复杂问题简单化,本…

2024年06月在线IDE流行度最新排名

点击查看最新在线IDE流行度最新排名(每月更新) 2024年06月在线IDE流行度最新排名 TOP 在线IDE排名是通过分析在线ide名称在谷歌上被搜索的频率而创建的 在线IDE被搜索的次数越多,人们就会认为它越受欢迎。原始数据来自谷歌Trends 如果您相…

JAVA流程控制--For循环

1.虽然所有循环都可以用while或do...while表示,但Java提供了另外一种语句——for循环,使一些循环结构变得简单 2.for循环语句是支持迭代的一种通用结构,是最有效,最灵活的循环,结构 3.for循环执行的次数是在…

快速排序(排序中篇)

1.快速排序的概念及实现 2.快速排序的时间复杂度 3.优化快速排序 4.关于快速排序的细节 5.总代码 1.快速排序的概念及实现 1.1快速排序的概念 快速排序的单趟是选一个基准值,然后遍历数组的内容把比基准值大的放右边,比基准值小的放在左边&#xf…

编译原理【第四+七章】

考试题 1、简述语法制导翻译的基本思想 将语法分析和语义分析结合起来,通过语法规则驱动语义动作执行,用于将源程序翻译成目标代码或中间代码。 通过使用属性和语义动作,编译器可以在语法分析的同时生成目标代码或中间代码,实现…

网络原理——TCP/IP--数据链路层,DNS

T04BF 👋专栏: 算法|JAVA|MySQL|C语言 🫵 今天你敲代码了吗 目录 数量链路层目的地址和原地址类型校验和 DNS 数量链路层 主要的协议是以太网协议.一个横跨数据链路层和 物理层的协议,既包含了数据链路层的内容, 也包含了⼀些物理层的内容 我们来了解一…