TypeScript 基础类型系统

TypeScript详解(安装使用、基础类型总结、类型断言用法、接口、类、函数、泛型、相同类型之间赋值、unknown、枚举等) TypeScript概念 是 JavaScript 的一个超集,它可以编译成纯JavaScript,也可以在任何浏览器操作系统运行。简单来说就是JS的一个升级版本,给JS加了限制规范(接口等),也扩展了JS(类等)的能力 基础类型 注意和JS不同,JS区分基础类型和复杂数据类型,TS不区分,即基础类型就是数据类型,它包括JS中的6中数据类型(undefined、null、boolean、number、string、object),不包含symbol。除此之外还包含函数、数组、元祖、枚举、任意值(. 阅读详情

目录

  1. 基础类型
  2. 联合类型
  3. 交叉类型
  4. 函数(参数与返回值, 剩余参数, 可选参数, 推导方式, 重载)
  5. 类/抽象类

基础类型

TypeScript 基础类型有 12 种分别为 number, string, boolean, array, tuple, undefined, null, void, never, object, symbol, bigint. 接下来每个类型我都会举2~3个例子来让你明白该类型的作用

number 数字类型

TS 的数字类型是包含 小数的, 也就是说 TypeScrpit 并没有 浮点类型, 这是因为 TS 只是一个 只有做静态检查 并没有在底层做 内存分配 检查完毕后最终还是要 编译 为 JS

let a: number = 10;

let b: number = 10.1;

console.log(a); // 10

console.log(b); // 10.1

string 字符串类型

字符串类型在 TS 中使用与 number 类似

let s1: string = 'str';

console.log(s1); // str

boolean 布尔类型

布尔类型在 TS 中只能是 true 或 false

let b: boolean = true;

let b1: boolean = false;

// let b2: boolean = 1; // error

array 数组

数组中元素类型可以不唯一, 也无需定义 长度

// 单类型数组定义(表示数组中只能存储 数字类型)
let arr: number[] = [1, 2, 3];

// 多类型数组(数组可以存储 数值, 字符串, 布尔 类型)
let arr1: (number | string | boolean)[] = [1, 2, '2', true, 3];

// 通过泛型来定义数组(先知道, 后续学到泛型会在看到)
let arr2: Array<string | number> = [1, '2', 3];

console.log(arr2);

arr1.push(6);

arr1.pop();

console.log(arr1);

tuple 元组

元组与数组的区别: 元组是由一组相同类型且固定长度数组 组成
元组特点:

  1. 元组可以调用数组方法, 理论上 通过 类型推导结果是无法完成 push,pop,reverse 这些操作的, 但是 TS 最终还是变为 JS 也就是说最终是这三个操作都成功执行
let tuple: [string, number, boolean] = ['1', 2, true];

tuple.push(1);
// tuple[3]; // error 因为长度已经固定, 所以理论上是无法添加
tuple.pop();
tuple.pop();
tuple[2]; // 因为长度是固定的
tuple.reverse();
// 这是 tuple 的 类型推导结果 let tuple: [string, number, boolean]
tuple;

Enum 枚举

枚举

枚举分类: 枚举, 常量枚举(性能更加优秀), 异构枚举
我们先从 枚举入手, 枚举编译出来后就是一个对象, 枚举的原理: 是根据上一个枚举元素来推断下一个枚举元素(我们看最终编译结果即可得知), 枚举还可以划分为 正0举(通过枚举元素访问)/反举(通过索引访问)

enum OPERATOR_TYPE {
  DELETE, // 删除 => 0
  RECYCLE, // 移动到回收站 => 1
  CREATED, // 创建 => 2
  UPDATE, // 更新 => 3
  RESTORE = "RESTORE", // 恢复 => RESTORE
  // STORE // 错误, 枚举是根据上一个值进行推断的
}

// 正举
console.log(OPERATOR_TYPE.RECYCLE); // 1
console.log(OPERATOR_TYPE.DELETE); // 0

// 反举
console.log(OPERATOR_TYPE[0]); // DELETE

在这里插入图片描述

常量枚举

为何说常量枚举性能更加优异呢? 这是因为 常量枚举并不会生成一个对象, 常量枚举更加接近于 编译宏 这个概念, 在编译时将 枚举值 直接替换到 对应位置

const enum OPERATOR_TYPE {
  DELETE, // 删除 => 0
  RECYCLE, // 移动到回收站 => 1
  CREATED, // 创建 => 2
  UPDATE, // 更新 => 3
  RESTORE = "RESTORE", // 恢复 => RESTORE
}

// 不能直接访问 OPERATOR_TYPE 会抛出错误
// 将枚举值直接替换到 下面这些位置中
console.log(OPERATOR_TYPE.DELETE);
console.log(OPERATOR_TYPE.RECYCLE);
console.log(OPERATOR_TYPE.CREATED);
console.log(OPERATOR_TYPE.UPDATE);
console.log(OPERATOR_TYPE.RESTORE);

在这里插入图片描述

异构枚举

异构枚举就是 枚举集合中拥有多个类型的枚举

enum OPERATOR_TYPE {
  DELETE,
  RECYCLE,
  CREATED = 'CREATED'
}

console.log(OPERATOR_TYPE.DELETE);
console.log(OPERATOR_TYPE.RECYCLE);
console.log(OPERATOR_TYPE.CREATED);

undefined 与 null

undefined 与 null 是 所有类型的 子类型, 什么叫做 子类型呢? 就是说 我们可以给 任意类型赋值为 undefined 或 null, 但是前提是需要将 tsconfig.json 中的严格检查关闭, TS 中默认为 严格检查模式

let n1: number = null;
let s1: string = null;
let b1: boolean = null;
let ns2: number[] = null;

let n2: number = undefined;
let s2: string = undefined;
let b2: boolean = undefined;
let ns3: number[] = undefined;

void 空值返回

void 一般作用于函数返回值的定义, 函数定义一般不会是 undefined 而是选择 void

// 一般不推荐使用 funciton getVal(): undefined {...}
// VsCode 默认返回值为 void
function getVal1() {

}
function getVal(): void {
  console.log('this method return typeof value is void');

  // return undefined;
  return;
}

never

never 同样也是任意类型的子类型, 但是 never 我觉得更加适用与 fallback(备用) 兜底类型/备用类型
never 在哪些情况下使用呢?

  1. 当程序无法执行到终点时?
  2. 类型保护(也可以叫做 fallback, 兜底类型/备用类型)
    什么叫做程序无法执行到终点呢?
// 抛出错误, 程序就被重点 无法执行到重点
function getVal(): never {
	throw new Error();
}
// 程序无法进入下一步
function loop(): never {
	while(true) {}
}

类型保护

function validate(value: never) {
  throw new Error(value);
}

  

function getValue(value: string | number | boolean) {
  if(typeof value === 'string') {
    return value;
  }
  

  if(typeof value === 'number') {
    return value;
  }
  
  if(typeof value === 'boolean') {
    return value;
  }

  validate(value);
}

object

object 可以使用三种方式定义: Object/{}/object, 但是推荐使用 第三种方式, 我们来单独说说三种的区别吧!

  1. Object 用于描述类, 同时还可以使用点语法调用 Object.prototype 的方法,他与 any 的范围是有些相似的, Object 将范围扩展非常大, 除 undefined,null 以外都可以赋值(在严格模式下, 不检查 null 情况下则不会抛出错误)
  2. 使用 {} 一般用于赋值 空对象, 但是非常少用
  3. object 是我们最常用的, 常用于 定义较大范围的一个值
let obj: {} = {};

// let obj1: Object = null; // error
let obj2: any = null;

function create(value: object) {}
create([]);
create({});
create(function() {});

symbol 符号类型

symbol 较为少用, 作用为 创建唯一的一个值, 当然也可以使用 .for 方法设置非唯一值

let s: symbol = Symbol('123');
let s1: symbol = Symbol('123');
console.log(s === s1); // false
  

let s2: symbol = Symbol.for('123');
let s3: symbol = Symbol.for('123');
console.log(s2 === s3); // true

bigint 大范围整数

  1. 用于创建 超出 Number 最大值范围的整数
console.log(Number.MAX_VALUE);
console.log(Number.MAX_SAFE_INTEGER);

let b: bigint = BigInt(Number.MAX_VALUE);
let b1: bigint = BigInt(Number.MAX_SAFE_INTEGER);

console.log(b);
conosle.log(b1);

[[any]] 任意类型

any 特点就是 绕过类型检测

let a: any = 123;
let a1: any = '123';
let a2: any = true;
let a3: any = function () {};
let a4: any = [];
let a5: any = {};
let a6: any = Symbol('123');
let a7: any = Symbol.for('123');
let a8: any = BigInt(Number.MAX_SAFE_INTEGER);
let a9: any = { 0: 1, length: 1, splice: Array.prototype.splice };

字面量类型(这是一个特殊的类型)

字面量类型一般是使用 const 来定义而转变为 字面量类型, 但是你也可以手动声明类型 将其字面量类型转换为 你所定义的 目标类型

const a = 10; // 类型推断为 10

const b = 'str'; // 类型推断为 str

const c = true; // 类型推断为 true

const d = {}; // 类型推断为 {}

const e = []; // 类型推断为 []

const f = function() {}; // 类型推断为 () => void

公共方法

在 TS 中公共方法就是 多种类型都有的一个方法, 就好比 number,string,boolean,array,object,funciton 都有 toString 方法, 那么 toString 就是一个公共方法

let a: number | string;

a.toString();

断言

断言的作用 就是 让 TS 依附于你的 建议, 你认为该值的类型是什么 那么就是什么, 但出现问题你应该负责, 断言分为四大类

  1. 非空断言: 认定该值一定不是空, 使用 ! 进行断言
const ele = document.getElementById('ele')!; // 认定你获取的 DOM 元素一定不为空
  1. as 断言/类型断言: 将一种不确定的类型转换为一个确定的类型, 也可以认为是 类型收缩/类型缩小
const ele = document.getElementById('ele');

(ele as HTMLElement).style.display = 'none';
  1. 类型断言: 使用类似与泛型的写法即可进行类型断言, 同属于类型收缩
const ele = document.getElementById('ele');

(<HTMLElement>ele!).style.background = 'red';
  1. 双重断言: 当一个类型无法兼容你需要转换的类型时, 即可使用双重断言
const ele = document.getElementById('ele');

(ele as any) as number; // 这是一个不合理的操作, 但这只是为了演示

联合类型/自定义类型

联合类型是将 多种类型 合并为一种类型, 常用于构建 新的 复杂类型
我们将定义一个由 多个字符串 组成的一个类型

type ACTION = 'up' | 'down' | 'left' | 'right';

let action: ACTION = 'up';

属性互斥, 使用联合类型我们可以定义一个 互斥类型, 根据一个值来确定一个对象的类型

type IPerson = {
  name: 'Xiao',
  [K: string]: any
} | {
  name: 'Lin',
  [K: string]: any
}

const Xiao: IPerson = {
  name: 'Xiao',
  age: 16
}

const Lin: IPerson = {
  name: 'Lin',
  age: 16
}

交叉类型

交叉类型就是将其取交集, 一般用于将 对象合并

interface IPerson {
  name: string;
}

interface ISkill {
  skill: string[];
}

interface IHobby {
  hobby: string[];
}


type INewPerson = IPerson & ISkill & IHobby;
  
let newPerson: INewPerson = {
  name: 'Xiao',
  skill: ['C/C++', 'JavaScript', 'Rust'],
  hobby: ['Running', 'Learning', 'reading', 'finance'],
}

函数类型

函数定义类型注解两种方式

从宏观来说我们的函数定义就两种方式 一种直接通过 function 关键字来定义, 一种是 函数表达式, 所以我们有两种定义方式相同的 注解也有两种定义方式

// 函数本身进行注解
function test(a: number, b: number): number {
  return a + b;
}

// 定义函数实现或类型别名
type ITest = (x: number, b: number) => number;

const test1: ITest = (a, b) => {
  return a + b;
}
参数注解

参数注解就是给函数参数 添加类型注解从而来限定 用于限定用户传入的参数

function test(a: string, b: string) {
  return a + b;
}
可选参数

可选参数原理与函数默认值 不可并存, 添加可选参数就是给参数设置 用户设置类型 | undefined
可选参数特点:

  1. 与函数默认值不可并存
  2. 可选参数 后面不可在有参数
// VsCode 推断的类型为 b => string | undefined, c => boolean | undefined
function test(a: number, b?: string, c?: boolean) {}

// 可选参数后面还跟则 参数
// function test1(a: string, b?: number, c: boolean) {} // error
剩余参数

%% 需要添加剩余参数 引用 %%
[[剩余参数]]
剩余参数为一个数组, 需要定义的类型为 类型数组

function test(a: number, ...rest: number[]) {}
返回类型设置

函数返回类型若是为 void 则表示 不关心其返回类型(但是这只能基于 [[TS 推导方式#根据上下文自动推导]] 的方法进行使用)

type ITest = (x: number, y: number) => void;

const test: ITest = (a, b) => {
  return a + b;
};

test(1, 2);
函数 this 指向

若是需要让函数中使用并将 this 指向目标, 需要将 this 定义在第一项
[[keyof 的使用]]
[[typeof 的作用]]

const obj = {
  name: 'Xiao',
  age: 20
}

type IObj = typeof obj;

function getVal(this: IObj, key: keyof IObj) {
  return this[key];
}

getVal.call(obj, 'name');
函数重载

重载的定义就是 参数个数或参数类型不同时 重载就会产生
TS 中的重载并不是 真正的重载而是 伪重载 只重载类型 不重载逻辑, TS 重载的作用其实最重要的就是让TS类型推断更加精确让编辑器提示更加准确

function toArray(n: number): number[];
function toArray(n: string): string[];
function toArray(n: number | string): number[] | string[] {
  if(typeof n === 'number') {
    return n.toString().split('').map(Number);
  } else {
    return n.split('');
  }
}
  
const arrNum = toArray(123); // 推断为 number[]
const arrStr = toArray('123'); // 推断为 string[]
总结
  1. 函数我们主要学习 参数注解, 可选参数, 剩余参数, 返回类型设置, this, 函数重载

类

构造器

TS 构造器初始化方式分为两种,一种是 先定义在赋值, 后者是 一体化赋值

  1. 先定义在赋值
class Person {
  public name: string;
  public age: number;
  constructor(name: string, age: number) {
    this.name = name;
    this.age = age;
  }
}
  1. 一体化赋值
class Person {
  // 一体化赋值
  constructor(
    public name: string,
    public age: number
  ) {}
}
修饰符

修饰符的作用是决定 属性/方法 是否可见, 属性修饰符可以分为以下四类:

  1. public: 公共(谁都可以进行 操作)(同时也是 默认的修饰符, 若是定义 属性/方法 不定义则默认为 public)
  2. protected: 受保护(仅允许 当前类或子类进行 操作)
  3. private: 私有(仅允许当前类进行 操作)
class Person {
  constructor(
    public name: string,
    protected age: number,
    private skill: string
  ) {}
}

class Xiao extends Person {
  constructor(name: string, age: number, skill: string) {
    super(name, age, skill);
    console.log(this.name);
    console.log(this.age);
    // console.log(this.skill); // 无法访问, 因为仅有 Person 可以访问
  }
}
实例属性/方法

定义实例属性/方法 默认的类型修饰符都为 public

class Person {
  // 定义实例属性
  public inst:string = "PersonInst";
  // 定义实例方法
  public getName: () => string = function(this: any) {
    return this.name || 'name is null';
  }

  constructor(
    public name: string,
    public age: number
  ) {}
}

const p = new Person('Xiao', 20);
console.log(p);
原型方法
class Person {
  constructor(
    public name: string,
    public age: number
  ) {}
  
  // 定义原型方法(默认为 public)
  getName() {
    return this.name;
  }
}
静态属性
class Person {
  constructor(
    public name: string,
    public age: number
  ) {}

  static getVal() {
    return this.personName;
  }
  
  static personName: string = "PERSON";
}

Person.getVal(); // PERSON
属性访问器
class Person {
  constructor(
    public name: string,
    public age: number,
    private _skill: string
  ) {}
  
  // 属性访问器
  get skill(): string[] {
    return this._skill.split(',');
  }

  set skill(value: string) {
    this._skill = value;
  }
}
  
const p = new Person('Xiao', 20, 'JS,C,English,Math');
console.log(p);
console.log(p.skill);
类方法重载
class Person {
  getName(value: string) : string;
  getName(value: string[]): string;
  getName(value: string | string[]): string {
    if(typeof value === 'string') {
      return 'value | ' + value;
    } else {
      return 'value[] |' + value.join(',');
    }
  }
}

const p = new Person();
p.getName('1');
p.getName(['test', 'test1']);
继承/重写

实例,静态,原型,属性访问器 等 都可以继承
重写注意点:

  1. 类型需要兼容, 父类若返回类型设置 void 则表示不关心其返回值
class Person {
  private _computer: string = "";
  constructor(public name: string, public age: number) {}
  
  get computer() {
    return this._computer;
  }
  
  set computer(value) {
    this._computer = value;
  }

  static value: string = "Person";

  static getVal() {
    return this.value;
  }

  // 父类若是声明 void 则表示 不关心 子类的返回值, 但是
  getVal(): void {
    console.log('person name', this.name);
  }
}

class Xiao extends Person {
  constructor(name: string, age: number) {
    super(name, age);
  }

  // 子类重写父类 需要让 子类类型兼容父类(若是父类有参数)
  getVal() {
    return this.name;
  }
  static value: string = "Xiao";
}

const xiao = new Xiao('Xiao', 20);
xiao.computer = 'M';
console.log(xiao.computer); // M
console.log(xiao.getVal()); // Xiao
console.log(Xiao.getVal()); // Xiao
抽象类

抽象类是用于 给子类提供一个 统一的接口或框架
抽象类特点:

  1. 不可被new
  2. 可以包含方法具体实现, 但是抽象提供的接口则一定需要 实现
abstract class Animal {
  abstract eat(): void;
  // 注意该方式是定义实例方法
  abstract run: () => void;
  drank(): string {
    return 'drank';
  }
}


class Tiger extends Animal {
  eat(): void {
    throw new Error("Method not implemented.");
  }

  run: () => void = () => {};
}

const tiger = new Tiger();

tiger.drank(); // drank

使用场景: 当父类不想要被 new 时即可使用

绕过 TS 类型检查
  1. 使用 [] 语法即可绕过 TS 对 类修饰符的检测
class Person {
  constructor(
    private name: string
  ) {}
}

const p = new Person('Xiao');
// p.name // 错误
console.log(p['name']); // xiao

总结

  1. 基础类型: number,string,boolean,array,tuple,undefined,null,never,void,object,symbol,bigint
  2. 枚举: 枚举,常量枚举
    1. 枚举: 编译后形成对象
    2. 常量枚举: 类似 C 语言中的编译宏 概念, 编译出来直接将值 填入对应位置, 性能更加优异
    3. 枚举可以使用 正举(通过枚举元素访问)/反举(通过索引访问)
  3. 交叉类型: 交叉类型一般用于 合并对象
  4. 联合类型: 联合类型用于 产生一个新类型
  5. 函数(剩余/可选 参数,返回值, 重载, 自动推导):
    1. 推导方式: 根据值推导,根据返回值推导,根据位置推导
    2. 可选参数与参数默认值只能任选其一
    3. 函数重载 其目的就是为了 让编辑器推断更加精确
  6. 类/抽象类
    1. 构造函数中可以使用 一体化赋值
    2. 参数修饰符: pubilc(函数与参数默认修饰符),protected,private(可以使用 []绕过私有属性检查)
    3. 类方法仍然可以进行重载
    4. 抽象类: 当父类不想被 new 时即可使用 抽象类, 抽象类所预定义的函数/实例 接口必须被实现

推荐观看(扩展阅读):

  1. any/unknown/never 区别
  2. TS 推导方式
TypeScript 类型系统完整指南 本文档详细介绍了 TypeScript 中所有主要的类型系统特性,每个类型都包含了定义、用法示例和实际应用场景。 阅读详情

相关推荐

抖音小游戏上架避坑指南:从软著申请到ICP备案全流程解析

本文详细解析了抖音小游戏上架前必须完成的软著申请和ICP备案全流程,提供了清晰的时间线规划与实操避坑指南。文章重点阐述了个人与企业备案的区别、材料准备要点以及平台审核常见问题,旨在帮助独立开发者和小团队高效、合规地完成游戏上架,避免在行政流程中延误项目。

weixin_29276847的博客 1571

TypeScript 常用类型

目录 1. 类型注解 2. 常用基础类型 1.JavaScript 已有类型 2. TypeScript 新增类型 3.原始类型 4. 数组类型 1.类型[]写法, 如 2.Array<类型>写法, 如 5.联合类型 6. 类型别名 7.函数类型 void 类型 函数可选参数 8. 对象类型 使用类型别名 带有参数的方法的类型 箭头函数形式的方法类型 对象可选属性 9. 接口 interface 接口和自定义类型的区别 接口继承 10...

m0_62118859的博客 5833

基于STM32开发的智能语音控制系统

本文将介绍如何使用STM32微控制器开发一个智能语音控制系统,通过语音识别模块、OLED显示屏、Wi-Fi模块等实现对家用电器或其他设备的语音控制。智能语音控制系统的核心是STM32微控制器,通过语音识别模块识别用户的语音指令,并根据指令控制家用电器或其他设备。:定期测试语音识别模块、继电器控制模块、OLED显示屏和Wi-Fi模块的工作状态,确保系统能够在各种情况下正常运行,并保持智能语音控制系统的可靠性。本系统同样适用于办公环境,可以通过语音指令控制办公室设备,如照明、空调等,提供智能化的办公体验。

stm32d1219的博客 6911

Typescript总结(二)——类型详解

** Typescript总结(二)——类型详解 **

weixin_47450807的博客 4954

大疆Livox Mid-70雷达的使用

一、前期准备 (一)、使用Livox Viewer测试雷达 1、设置静态IP sudo ifconfig enx081f7152092a 192.168.1.50 查看IP是否设置成功 lacyexsale@lacyexsale-KLV-WX9:~$ ifconfig enx081f7152092a Link encap:以太网 硬件地址 08:1f:71:52:09:2a inet 地址:192.168.1.50 广播:192.168.1.255 掩码:255.255.25

LacyExsale的博客 1万+

FID指标实战:如何用Python快速计算生成图像的质量分数(附完整代码)

本文详细介绍了如何使用Python计算Fréchet Inception Distance(FID)指标,以评估生成图像的质量。通过完整的代码示例和优化技巧,帮助开发者快速实现FID计算,并解读分数背后的实际意义,适用于GAN和扩散模型的性能评估。

weixin_28718487的博客 377

TypeScript常用类型介绍

它措述一个值,该值可以是这些命名常量中的一个。

2302_77101581的博客 1818

逆向解析M团外卖mtgsig与waimai_sign加密参数实战指南⊙ω⊙

本文详细解析了M团外卖App中mtgsig与waimai_sign两个核心加密参数的逆向分析与生成方法。通过抓包定位、静态逆向与Frida动态调试,拆解了waimai_sign的RSA签名逻辑与mtgsig的复杂参数组装加密流程,并提供了Python模拟实现的框架与调试心得,为安全研究及合规数据分析提供实战指南。

weixin_29327525的博客 1285

说说 Typescript 的数据类型有哪些?

一、是什么 typescript和javascript几乎一样,拥有相同的数据类型,另外在javascript基础上提供了更加实用的类型供开发使用 在开发阶段,可以为明确的变量定义为某种类型,这样typescript就能在编译阶段进行类型检查,当类型不合符预期结果的时候则会出现错误提示 二、有哪些 typescript的数据类型主要有如下: boolean(布尔类型) number(数字类型) string(字符串类型) array(数组类型) ...

foxi123的博客 1517

自制电吉他效果器 DIY PCB(二)电路图分析

自制DIY电吉他效果器 PCB(二)电路图分析 要自制一款效果器,看懂电路图是必须的,即使你已经有了完整的设计电路图,在电路的绘制已久焊接的时候电路知识都会用到。 在效果器电路中,比较简单的是过载失真类效果器的电路。混响延迟等与声相有关的由于电路比较复杂本人也没有尝试过。其他的例如EQ、哇音等等效果器复杂程度依设计各不相同,在能做出过载失真类效果器后,可以自行尝试。 我这里主要为大家介绍失真效果器...

qq_41342525的博客 2万+

别再让电池充不满!用CN3791芯片设计太阳能充电电路,这几个调试坑我帮你踩了

本文详细解析了使用CN3791芯片设计太阳能充电电路时的常见调试问题及解决方案。从RCS电阻的选择到MPPT电压偏差的修正,再到线路损耗和温度补偿的优化,提供了全面的避坑指南。通过实测数据和优化方案,帮助工程师提升锂电池充电效率,确保太阳能充电电路的稳定性和可靠性。

weixin_42528191的博客 241

TypeScript 的类型系统

TypeScript 的类型系统是其核心特性之一,它通过静态类型检查帮助开发者在编码阶段发现潜在错误,提升代码可维护性和协作效率

m0_72030584的博客 505

化工模拟与优化软件:Aspen HYSYS二次开发_(15).工业应用与项目管理

项目背景、目标和主要流程。

kkchenjj的博客 1131

TypeScript 类型系统极限探索

TypeScript的类型系统是图灵完备的:这意味着它具有条件分支(条件类型)并可以使用任意大量的内存。因此,您可以将类型系统作为其自己的编程语言来使用,包括变量、函数和递归。开发人员已经在类型系统中扩展了类型操作的边界,以编写一些非常令人难以置信的东西!本文收集了 TypeScript 开发人员对类型系统能够实现的功能的探索成果。它们从二进制算术和基本虚拟机到迷宫解算器和完整的编程语言。

专注于认知和效率提升方面的分享 1835

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

TypeScript基础类型系统深度解析

TypeScript基础类型系统深度解析 本文深入解析TypeScript的基础类型系统,涵盖原始数据类型(number、string、boolean等)、any类型的使用场景与最佳实践、类型推论机制以及联合类型与类型守卫的处理技巧。通过详细的代码示例和实际应用场景,帮助开发者全面掌握TypeScript类型系统的核心概念和使用方法。 原始数据类型:number、string、boolean等基础...

gitblog_00238的博客 1135

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

重新学习 TypeScript 类型系统

重新学习 TypeScript 类型系统

chengbo_eva的博客 906

理解 TypeScript 背后的结构化类型系统

基于类型结构进行类型兼容性判断关键体现在两个类型的比较当中,当两个类型比较时,如果是按照属性和方法是否相同来比较的话就称为结构化类型系统,也叫鸭子类型。')}')}虽然invokeSay函数接收的参数类型是Dog,但是由于Cat类型的结构和Dog是一样的(都是只有一个 say 方法),因此会被认为是同一种类型,这就是结构化类型的特点,基于类型结构进行类型兼容性判断代表语言:C#、Python、Objective-C基于类型名进行兼容性判断/** @description 人民币 */

发果叁 639

TypeScript类型系统

TypeScript类型系统:代码世界的"安全守卫"

m0_72030584的博客 1044

typescript:结构化类型系统

(1) TypeScript 的结构化类型系统是基于类型结构进行比较的,而标称类型系统是基于类型名来进行比较的。(2)在 TypeScript 中,可以通过为类型附加信息的方式,从类型层面或者逻辑层面出发去模拟标称类型系统。(3)类型、类型系统与类型检查类型:限制了数据的可用操作、意义、允许的值的集合,总的来说就是访问限制与赋值限制。在 TypeScript 中即是原始类型、对象类型、函数类型、字面量类型等基础类型,以及类型别名、联合类型等经过类型编程后得到的类型。

xuan的博客 283

TypeScript 类型系统解析

TypeScript 的类型系统是其最强大的特性之一,它通过丰富的类型定义方式和高级功能极大地提升了开发效率和代码质量。无论是初学者还是资深开发者,掌握 TypeScript 的类型系统都是必不可少的技能。希望本文能够帮助你更好地理解 TypeScript 的类型系统,并在你的项目中加以应用。``````htmlPython 3.12 的新特性解析:性能优化与语法改进Python 3.12 的发布标志着 Python 生态系统的一个重要里程碑。

2501_91305367的博客 1484

TypeScript基础语法与类型系统详解

TypeScript 是 JavaScript 的超集,提供了静态类型检查和丰富的类型系统,帮助开发者写出更健壮和可维护的代码。本文将系统介绍 TypeScript 的基础语法与类型系统,包括基本类型、类型组合、接口与类型别名、高级类型用法等核心内容。

2403_86719076的博客 924

TypeScript 从入门到精通:第二章 类型系统

摘要:本文系统介绍了TypeScript的类型系统及其核心机制。首先阐述了类型与值的关系及类型系统在代码可读性、安全性和维护性方面的重要作用。然后详细解析了基本类型和高级类型,包括联合类型、交叉类型等概念。接着分析了类型不匹配和缺失等常见错误类型,并深入探讨了类型兼容性规则及其应用场景。文章还介绍了类型注解的使用场景和语法规范,同时指出冗余类型注解问题及其避免方法。最后论述了模块化开发的优势及类型系统在其中发挥的关键作用,包括明确接口定义、确保类型安全等方面。

caifox的博客 1378

TypeScript的类型系统

ts的基本类型,undefined、null、any、unknown、never、number、string、boolean、object、symbol、bigint

Sapling 409

浅谈 TypeScript 类型系统

讲到TypeScript一定离不开它的类型系统,强类型约束是对原本弱类型的JavaScript的补充。而相对Java、C#等后端语言的标明类型系统(Nominal Type System),TypeScript采用的是结构类型系统(Structural Type System)。标明类型系统比较的是类型本身,具备非常强的一致性要求。结构类型系统比较的并不是类型定义本身,而是类型定义的形状。 高级类型 type Point = { x: number; y: number; }; type N

betty_grant的博客 626

typescript的类型描述_浅谈 TypeScript 类型系统

时下,TypeScript 可谓当红炸子鸡,众多知名开源项目纷纷采用,大型项目几乎成为必备。其中缘由,除了微软这一开源项目新势力的强大背书以外,最为核心的即是 TypeScript 的类型系统。JavaScript 太需要一套合适的类型体系来支撑日益规模化的协作开发了。那么为什么 TypeScript 的类型系统能够做到这一点,而同时期的很多其它方案纷纷落入下风呢?本文着重从原理上剖析 TypeS...

weixin_35652131的博客 438

typescript get方法_浅谈 TypeScript 类型系统

时下,TypeScript 可谓当红炸子鸡,众多知名开源项目纷纷采用,大型项目几乎成为必备。其中缘由,除了微软这一开源项目新势力的强大背书以外,最为核心的即是 TypeScript 的类型系统。JavaScript 太需要一套合适的类型体系来支撑日益规模化的协作开发了。那么为什么 TypeScript 的类型系统能够做到这一点,而同时期的很多其它方案纷纷落入下风呢?本文着重从原理上剖析 TypeS...

weixin_39946274的博客 569
上一篇: 初识 NodeJS
下一篇: interface 与 type
Su.lk
博客等级 码龄6年 91粉丝 8原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值