TypeScript学习笔记(二)

这篇具有很好参考价值的文章主要介绍了TypeScript学习笔记(二)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1、字符串字面量类型

type EventNames = 'click' | 'scroll' | 'mouseover'

字符串字面量类型用来约束取值只能是某几个字符串中的一个

2、元祖(Tuple)

数组:同一类型的集合
元祖:不同类型的集合

let value: [string, number] = ['xiaoming', 18]

3、枚举(Enum)

枚举使用 enum 关键字来定义

eunm Colors {White, Black, Red}

枚举成员会被赋值为从 0 开始递增的数字,同时也会对枚举值到枚举名进行反向映射

console.log(Colors['White']) // 0
console.log(Colors['Black']) // 1
console.log(Colors['Red']) // 2

可以给枚举项手动赋值:

eunm Colors {White = 7, Black = 2, Red}

console.log(Colors['White']) // 7
console.log(Colors['Black']) // 2
// 未手动赋值的枚举项会接着上一个枚举项递增
console.log(Colors['Red']) // 3

未手动赋值的枚举项与手动赋值的重复时,会被后赋值的那一次覆盖。

上面的例子都是常数项,下面是一个计算所得项的例子:

eunm Colors {White, Black, Red = 'Red'.length}

注意:如果紧接在计算所得项后面的是未手动赋值的项,那么它就会因为无法获得初始值而报错

常数枚举

常数枚举使用 const enum 定义,不能包含计算成员

const enum Colors {
	White,
	Black,
	Red
}

外部枚举

外部枚举使用 declare enum 定义,常出现在声明文件中,declare 定义的类型只会用于编译时的检查,编译结果中会被删除

4、类

TypeScript可以使用三种访问修饰符(修饰属性或方法):

  • public:修饰的属性或方法是公有的,可以在任何地方被访问到,默认所有的属性和方法都是public的
  • private:修饰的属性或方法是私有的,不能在声明它的类的外部访问;当构造函数修饰为 private 时,该类不允许被继承或者实例化
  • protected:修饰的属性或方法是受保护的,它和 private 类似,区别是它在子类中也是允许被访问的;当构造函数修饰为 protected 时,该类只允许被继承

以上三种修饰符和readonly关键字还可以用在构造函数的参数中,等同于类中定义该属性并同时给该属性赋值

class Animal {
  // public name: string;
  public constructor(public name) {
    // this.name = name;
  }
}

readonly关键字

只读属性关键字,只允许出现在属性声明或索引签名或构造函数中。
readonly 和其他访问修饰符同时存在的话,需要写在其后面。

class Animal {
  readonly name;
  public constructor(name) {
    this.name = name;
  }
}

let a = new Animal('Jack');
console.log(a.name); // Jack
a.name = 'Tom';

// index.ts(10,3): TS2540: Cannot assign to 'name' because it is a read-only property.

抽象类

使用abstract定义抽象类和其中的抽象方法,抽象类不允许被实例化,抽象类中的抽象方法必须被子类实现

abstract class Animal {
  public name;
  public constructor(name) {
    this.name = name;
  }
  public abstract sayHi();
}

class Cat extends Animal {
  public sayHi() {
    console.log(`Meow, My name is ${this.name}`);
  }
}

let cat = new Cat('Tom');

给类加上TS的类型

class Aniaml {
	name: string,
	constructor(name: string) {
		this.name = name
	}
	sayHi(): string {
		return 'Hello'
	}
}

let cat: Animal = new Animal('Tom')
console.log(cat.sayHi())

5、类与接口

接口的两个作用:

  • 用于对对象的形状进行描述
  • 对类的一部分进行抽象

类实现接口(implements)

interface Alarm {
    alert(): void;
}

interface Light {
    lightOn(): void;
    lightOff(): void;
}

class Car implements Alarm, Light {
    alert() {
        console.log('Car alert');
    }
    lightOn() {
        console.log('Car light on');
    }
    lightOff() {
        console.log('Car light off');
    }
}

接口继承接口

interface Alarm {
    alert(): void;
}

interface LightableAlarm extends Alarm {
    lightOn(): void;
    lightOff(): void;
}

接口继承类

在Java等面向对象的语言中,接口是不能继承类的,但是在TypeScript中可以:

class Point {
    x: number;
    y: number;
    constructor(x: number, y: number) {
        this.x = x;
        this.y = y;
    }
}

interface Point3d extends Point {
    z: number;
}

let point3d: Point3d = {x: 1, y: 2, z: 3};

接口继承类,实际上也是接口继承接口。
实际上,当我们声明class Point的时候,会同时做这件事:

  • 创建一个名为Point的类
  • 创建一个名为Point的类型
    所以我们既可以将Point当作一个类来用:
const p = new Point(1, 2)

也可以将Point当作一个类型来用:

let p: Point = {x: 1, y: 2}

在上面的例子中,interface Point3d extends Point Point3d继承的实际上是Point的实力的类型,可以按下面这个例子理解: Point3d 继承另一个接口 PointInstanceType

class Point {
    x: number;
    y: number;
    constructor(x: number, y: number) {
        this.x = x;
        this.y = y;
    }
}

interface PointInstanceType {
    x: number;
    y: number;
}

// 等价于 interface Point3d extends PointInstanceType
interface Point3d extends Point {
    z: number;
}

let point3d: Point3d = {x: 1, y: 2, z: 3};

注意:声明 Point 类时创建的 Point 类型只包含其中的实例属性和实例方法。同样的,在接口继承类的时候,也只会继承它的实例属性和实例方法。

6、泛型

泛型(Generics)是指在定义函数、接口或类的时候,不预先指定具体的类型,而在使用的时候再指定类型的一种特性。

function createArray<T>(length: number, value: T): Array<T> {
	let result: T[] = [];
	for(let i = 0;i < length; i++) {
		result[i] = value
	}
	return result;
}

createArray<string>(3, 'x'); // ['x', 'x', 'x']

使用泛型:函数名后添加 <T>

多个类型参数

function swap<T, U>(tuple: [T, U]): [U, T] {
    return [tuple[1], tuple[0]];
}

swap([7, 'seven']); // ['seven', 7]

在函数内部使用泛型变量的时候,由于事先不知道它是哪种类型,所以不能随意的操作它的属性或方法,这时,我们可以对泛型进行约束,只允许这个函数传入那些包含该属性的变量。这就是泛型约束:文章来源地址https://www.toymoban.com/news/detail-407519.html

interface Lengthwise {
    length: number;
}

function loggingIdentity<T extends Lengthwise>(arg: T): T {
    console.log(arg.length);
    return arg;
}

到了这里,关于TypeScript学习笔记(二)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C语言:字符串字面量及其保存位置

    相关阅读 C语言 https://blog.csdn.net/weixin_45791458/category_12423166.html?spm=1001.2014.3001.5482         虽然C语言中不存在字符串类型,但依然可以通过数组或指针的方式保存字符串,但字符串字面量却没有想象的这么简单,本文就将对此进行讨论。         字符串字面量保存在静态存储

    2024年02月03日
    浏览(42)
  • JavaScript字符串字面量详细解析与代码实例

    JavaScript字符串字面量是一种表示字符串值的语法结构,通常用双引号或单引号括起来。 另外,如果需要在字符串中包含双引号或单引号,可以使用转义字符 来实现。 除了双引号和单引号,JavaScript字符串字面量还支持一些特殊字符的转义,如下表所示: 转义字符 描述 \\\\

    2024年02月05日
    浏览(41)
  • Python f-strings - PEP 498 - 字面字符串插值

    Python f-strings 或格式化字符串是格式化字符串的新方法。此功能是在 Python 3.6 中引入的,属于 PEP-498。它也被称为 字面字符串插值 。 Python 提供了各种格式化字符串的方式。让我们快速看一下它们以及它们存在的问题。 % 格式化 - 适用于简单的格式化,但对于字符串、整数、

    2024年02月19日
    浏览(45)
  • C++入门学习(十二)字符串类型

    上一节(C++入门学习(十一)字符型-CSDN博客)中我们学到如何表示和使用一个字符串,本篇文章是字符串(多个字符)。 定义字符串主要有两种方式: 第一种: char str[] = \\\"win\\\";  //char 变量名[] = \\\"字符串\\\" 第二种: #include string string str1 = \\\"winner\\\"; / / 两种方式代码:  注意字符

    2024年01月23日
    浏览(40)
  • 【Python 笔记(二)——基本语句 变量类型 字符串 序列 列表与元组 字典与集合】

    在 Python 中,基本语句可以帮助我们完成一些基本的操作,如控制流程、定义函数等。以下是 Python 中的几种基本语句: if 语句 if 语句用于判断某个条件是否成立,如果条件成立则执行相应的代码块。 for 语句 for 语句用于遍历序列中的元素,依次执行相应的代码块。 while 语

    2024年02月08日
    浏览(50)
  • Java学习笔记:字符串

    目录 Java学习笔记:字符串 String 创建String对象 内存模型 String 比较 Scanner验证键入的字符串本质是new出来的 练习案例:判断账户和密码是否一致 遍历字符串 统计字符次数 字符串反转 StringBuilder StringBuilder构造方法 链式编程 拼接字符串 StringJoiner 总结 必须学习使用JDK API帮助

    2024年03月17日
    浏览(96)
  • 【Python零基础学习入门篇③】——第三节:Python的字符串类型

    ⬇️⬇️⬇️⬇️⬇️⬇️ ⭐⭐⭐Hello,大家好呀我是陈童学哦,一个普通大一在校生,请大家多多关照呀嘿嘿😁😊😘 🌟🌟🌟 技术这条路固然很艰辛,但既已选择,该当坚毅地走下去,加油! 🌤️PUA: ” 你所看到的惊艳都曾平庸历练 **“**🚀🚀🚀 🍉🍉🍉 最后让我

    2024年02月04日
    浏览(46)
  • Python3 学习笔记 ~ 怎样打印字符串

    Python中变量的打印方法_python打印变量_清欢依旧的博客-CSDN博客

    2024年02月15日
    浏览(67)
  • Typescript中将字符串转为数值有哪些方法?

    在TypeScript中,将字符串转换为数值(即字符串到数字的类型转换)有几种方法。以下是一些常见的方法: 1、使用全局函数 parseFloat() 和 parseInt(): 2、使用 Number 构造函数: 3、使用模板字面量和 + 运算符: 4、使用 parseInt() 和 parseFloat() 方法的函数形式: 需要注意的是,这些

    2024年02月12日
    浏览(41)
  • 数据结构与算法之字符串: Leetcode 557. 反转字符串中的单词 III (Typescript版)

    翻转字符串中的单词 III https://leetcode.cn/problems/reverse-words-in-a-string-iii/ 描述 给定一个字符串 s ,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序。 示例 1: 示例 2: 提示: 1 = s.length = 5 * 1 0 4 10^4 1 0 4 s 包含可打印的 ASCII 字符。 s 不包含任何开头或

    2024年02月01日
    浏览(77)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包