将泛型与接口、类和类型一起使用 在 TypeScript 中创建接口和类时,使用泛型类型参数来设置结果对象的形状会很有用。 例如,一个类可能具有不同类型的属性,具体取决于传递给构造函数的内容。.../类的一个常见用例是当您有一个字段,其类型取决于客户端代码如何使用接口/类时。...第一个,Keys,是你想要确保你的对象拥有的所有键。在这种情况下,它是所有商店代码的联合。 T 是当嵌套对象字段具有与父对象上的键相同的键时的类型,在这种情况下,它表示运送到自身的商店位置。...keyof T 运算符用于返回具有 T 中所有可用属性名称的联合。然后使用 K in 语法指定新类型的属性是返回的联合类型中当前可用的所有属性 T键。...结论 在本教程中,我们探索适用于函数、接口、类和自定义类型的泛型,以及使用了泛型来创建映射类型和条件类型。 这些都使泛型成为您在使用 TypeScript 时可以随意使用的强大工具。
它允许开发者通过传递参数到组件(比如函数,接口或者类)的方式编写可扩展、可重用的代码。本质上,泛型允许创建的组件可以在多种类型上工作,而不是在单一的类型上。...其核心是,TypeScript 泛型语法允许在尖括号内 内定义一个类型变量。这个类型变量随后可以在组件(比如函数或者类定义)中被使用,在事先不知道该类型是什么的情况下强制执行一致的类型使用。...当工作中处理集合,算法和数据结构的时候,它们尤其好用,因为泛型允许我们编写任何类型的代码,而不丢失类型信息。...在接口和类中使用泛型 在定义特定类型进行操作接口或者类时,泛型也非常有用。...泛型中使用 keyof TypeScript 中 keyof 操作符可以在泛型中结合使用,来确保属性名的类型安全。它生成类型的已知公共属性名称的联合。
(Person); 上边的 Demo 是一个非常再不同不过的例子了,我们定义接口 IPerson 时,这个接口定义了一个泛型参数 T 表示返回的实例类型。...当使用时,我们需要在使用接口时声明该 T 类型,比如IPerson。...(2) getPersonValue(2) 这里上下两个例子特别像强调的是关于泛型接口中泛型的位置是代表完全不同的含义: 当泛型出现在接口中时,比如interface IPerson 代表的是使用接口时需要传入泛型的类型,比如IPerson。...当泛型出现在接口内部时,比如第二个例子中的 IPerson接口代表一个函数,接口本身并不具备任何泛型定义。而接口代表的函数则会接受一个泛型定义。
可以同时使用两种类型的索引,但是数字索引的返回值必须是字符串索引返回值类型的子类型。 这是因为当使用number来索引时,JavaScript会将它转换成string然后再去索引对象。...假设 T 是一个类型,那么keyof T产生的类型就是 T 的属性名称字符串字面量类型构成的联合类型(联合类型比较简单,和交叉类型对立相似,这里就不做介绍了)。 「注意!...value; } // 两种调用方式 log(['a', ',b', 'c']) log(['a', ',b', 'c']) log('Nealyang') 泛型类型、泛型接口...: 函数和类可以轻松的支持多种类型,增强程序的扩展性 不必写多条函数重载,冗长的联合类型声明,增强代码的可读性 灵活控制类型之间的约束 泛型,在 ts 内部也都是非常常用的,尤其是对于容器类非常常用。...: boolean): number; 在这个 test 函数里,我们的本意可能是当传入参数 para 是 User 时,不传 flag,当传入 para 是 number 时,传入 flag。
TypeScript 是 JavaScript 的一个超集,它的设计初衷并不是为了替代 JavaScript,而是基于 JavaScript 做了一系列的增强,包括增加了静态类型、接口、类、泛型、方法重载等等...#name; // 访问会报错 泛型 应用场景:当我们需要考虑代码的可复用性时,就需要用到泛型。让组件不仅能够支持当前的数据类型,同时也能支持未来的数据类型。...泛型允许同一个函数接受不同类型参数,相比于使用 Any 类型,使用泛型来创建的组件可复用和易扩展性要更好,因为泛型会保留参数类型。泛型可以应用于接口、类、变量。...下面用一些示例来说明下泛型的使用: 泛型接口 interface identityFn { (arg: T): T; } 泛型类 class GenericNumber...使用大写字母 A-Z 定义的类型变量都属于泛型,常见泛型变量如下: T(Type):表示一个 TypeScript 类型 K(Key):表示对象中的键类型 V(Value):表示对象中的值类型 E(Element
#类型断言的限制 联合类型可以被断言为其中一个类型 父类可以被断言为子类 任何类型都可以被断言为 any any 可以被断言为任何类型 要使得 A 能够被断言为 B,只需要 A 兼容 B 或 B 兼容...A 即可 #泛型 泛型(Generics)是指在定义函数、接口或类的时候,不预先指定具体的类型,而在使用的时候再指定类型的一种特性。...当然,现在的编译器足够聪明,调用的时候可以不传递类型,编译器可以自己识别的 传递类型时,这个类型在函数中使用时的方法/属性,必须是存在的,或者继承自某个接口。...#泛型接口 可以为泛型提供一个用于约束参数/属性的类型的接口 interface Identities { value: V, message: M } function identity...这里我有意使用不同的变量名,以表明类型值沿链向上传播,且与变量名无关。 #泛型约束 确保属性存在 当我们在函数中获取length属性,在类型为number时,是没有length的,所以会报错。
通过显式传递泛型参数,我们可以确保在函数调用时指定了具体的类型。 2. 泛型接口 泛型接口允许我们在接口定义中使用类型参数,以便在实现该接口时指定具体的类型。...泛型类 泛型类允许我们在类定义中使用类型参数,以便在创建类的实例时指定具体的类型。...X : Y 其中,T 是待检查的类型,U 是条件类型,X 是满足条件时返回的类型,Y 是不满足条件时返回的类型。...通过调用 ReturnType,我们推断出 add 函数的返回类型为 number。 当涉及到泛型时,还有一些重要的概念和内置泛型函数可以深入分析。...以下是一些常见的官方内置泛型函数: Partial Partial 是 TypeScript 中的一个内置泛型类型,它可以将给定类型 T 中的所有属性转换为可选属性。
什么是 TypeScript、基本语法、高级类型、工程应用 # TypeScript 入门 # 什么是 TypeScript # 发展历史 2012-10:微软发布了 TypeScript 第一个版本...:静态类型、弱类型 JS 的本质是脚本语言,当被执行时才会匹配类型 TS 是不能被直接执行的,会在执行前进行类型匹配,编译后才能执行 # 优势 静态类型: 可读性增强:基于语法解析 TSDoc,ide...,而在使用的时候再指定类型的一种特性 */ type IGetRepeatArrR = (target: T) => T[]; /* 泛型接口 & amp; 多泛型 */ interface IX... = Array; /* 泛型约束:限制泛型必须符合字符串 */ type IGetRepeatStringArr = (target: T) => T...类型 “IB” 上不存在属性 “a" */ /* 结论:访问联合类型时,处于程序安全,仅能访问联合类型中的交集部分 */ if (arg.a) { console.log
越界的元素 当添加越界的元素时,它的类型会被限制为元组中每个类型的联合类型: let tom: [string, number]; tom = ['Tom', 25]; tom.push('male'...七、泛型 泛型(Generics)是指在定义函数、接口或类的时候,不预先指定具体的类型,而在使用的时候再指定类型的一种特性。...上例中,泛型 T 不一定包含属性 length,所以编译的时候报错了。 这时,我们可以对泛型进行约束,只允许这个函数传入那些包含 length 属性的变量。...7.5、泛型类 与泛型接口类似,泛型也可以用于类的类型定义中: class GenericNumber { zeroValue: T; add: (x: T, y: T) =>...当使用泛型时没有在代码中直接指定类型参数,从实际值参数中也无法推测出时,这个默认类型就会起作用。
需要注意的是,number是类型,而Number是构造函数。 当函数没有返回值时,返回类型就是void。只有null和undefined可以赋给void 。...(arg: Array) { console.log((arg as Array).length) return arg; } 泛型接口 泛型可以用于声明接口。...extends keyof T>,我们用「索引类型」 keyof T 把传入的对象的属性类型取出生成一个「联合类型」,这里的泛型 U 被约束在这个「联合类型」中。...keyof,即索引类型查询操作符,我们可以用 keyof作用于泛型 T 上来获取泛型 T 上的所有 public属性名构成联合类型。...Function,所以接口的值是泛型的key } 3、使用[keyof T] 依次取出上面生成的接口里的value 。
为什么:类似于 array-type,做语法统一,但需要注意的是在 Tsx 项目中使用 断言会导致报错,因为不像泛型可以通过 来显式告知编译器这里是泛型语法而非组件...no-unnecessary-type-arguments 不允许与默认值一致的泛型参数,如: function foo() {} foo(); 为什么:出于代码简洁考虑...no-unnecessary-type-constraint 不允许与默认约束一致的泛型约束,如:interface FooAny {}。...此规则的本质是检查经过断言后的类型子集是否仅剔除了空值部分,因此无需担心对于多种有实际意义的类型分支的联合类型误判。...,仅支持 extends、泛型 等简单的能力,也应当只被用于定义确定的结构体。
泛型表示的是一个类型在定义时并不确定,需要在调用的时候才能确定的类型,主要包含以下几个知识点: •泛型函数•泛型类•泛型约束 T extends XXX 我们试想一下,如果一个函数,把传入的参数直接输出...泛型约束,可以规定最终执行时,只能是哪些类型 function d2(param: T): T { return param; } let z...= d2(true); 其实泛型本来很简单,但许多初学 Typescript 的同学觉得泛型很难,其实是因为泛型可以结合索引查询符 keyof、索引访问符 T[k] 等写出难以阅读的代码,我们来看一下。...泛型中的兼容 泛型中的兼容,如果没有用到 T,则两个泛型也是兼容的。...中的高级类型包括:交叉类型、联合类型、字面量类型、索引类型、映射类型等,这里我们主要讨论一下 •联合类型•映射类型 联合类型 联合类型是指一个对象可能是多个类型中的一个,如:let a :number
组件不仅能够支持当前的数据类型,同时也能支持未来的数据类型,在定义函数,接口或类的时候,不预先指定类型,而是等到使用时才指定——这在创建大型系统时为你提供了十分灵活的功能。...在TypeScript中,可以使用泛型来创建可重用的组件,一个组件可以支持多种类型的数据。这样用户就可以以自己的数据类型来使用组件。...myLog: Log = log 6.3 泛型接口 泛型接口: interface Log { (value: T): T } 当你吧放到Log后面,接口的所有成员都会收到的约束...> = log my_log(1) // my_log只接收数字 6.4 泛型类 泛型类看上去与泛型接口差不多。...我们定一个length接口,表示定义了一个包含length属性的类型,然后让泛型参数继承这个接口: interface Length { length: number } const log =
它允许我们在定义函数、类或接口时使用类型占位符来表示类型,而不直接指定具体的类型。这样,在实际使用时,我们可以传入不同的类型参数,使得代码可以适用于多种情况。...泛型主要用在四个场合:函数、接口、类和别名。 # 基本使用 泛型使用尖括号 来表示,并在定义函数、类或接口时指定类型参数。...示例 2 和示例 3 展示了如何使用泛型函数并指定参数的类型。 。 # 2. 使用泛型变量: 泛型变量允许我们在函数或类中使用一种不确定的类型,而在实际使用时才确定具体的类型。...# 5.2 检查对象的 key 1、keyof typescript 中检测类型的方法,以联合类型的方式方返回类型的所有 key 2、搭配泛型约、 refshttps...# 6 泛型接口: 泛型接口允许我们定义可以适用于不同类型的接口。
T 代表 Type,在定义泛型时通常用作第一个类型变量名称,它可以用任何有效名称代替。...# 泛型使用时机 当函数、接口或类将处理多种数据类型时(为了通用) 当函数、接口或类在多个地方使用该数据类型时(为了一致) # 泛型约束 泛型约束用于限制每个类型变量接受的类型数量。...error return arg; } # 检查对象上的键是否存在 keyof 用于获取某种类型的所有键,其返回类型是联合类型: interface Person { name: string...# 泛型参数默认类型 可以为泛型中的类型参数指定默认类型,当使用泛型时没有在代码中直接指定参数类型参数,从实际值参数中无法推断出类型时,这个默认类型就会起作用。...当指定类型实参时,只需要指定必选类型参数的类型实参,未指定的类型参数会被解析为默认类型 一个被现有类或接口合并的类或者接口的声明可以为现有类型参数引入默认类型 一个被现有类或接口合并的类或者接口的声明可以引入新的类型参数
设计泛型的关键目的是在成员之间提供有意义的约束,这些成员可以是:类的实例成员、类的方法、函数参数、函数返回值。 泛型是允许同一个函数接受不同类型参数的一种模板。...T 代表 Type,在定义泛型时通常用作第一个类型变量名称。实际上 T 可以用任何有效名称代替。...(identity(2022, 'cell')); # 泛型接口 interface GenericIdentityFn { (arg: T): T; } # 泛型类 class GenericNumber...,其返回类型是联合类型。...原因是当使用数值索引时,JavaScript 在执行索引操作时,会先把数值索引先转换为字符串索引。
calculator.add("Semlinker", " Kakuqo"); 这里需要注意的是,当 TypeScript 编译器处理函数重载时,它会查找重载列表,尝试使用第一个重载定义。...设计泛型的关键目的是在成员之间提供有意义的约束,这些成员可以是:类的实例成员、类的方法、函数参数和函数返回值。 泛型(Generics)是允许同一个函数接受不同类型参数的一种模板。...12.1 泛型接口 interface GenericIdentityFn { (arg: T): T; } 12.2 泛型类 class GenericNumber { zeroValue...T 和 E,还有 K 和 V 这些泛型变量时,估计会一脸懵逼。...其实这些大写字母并没有什么本质的区别,只不过是一个约定好的规范而已。也就是说使用大写字母 A-Z 定义的类型变量都属于泛型,把 T 换成 A,也是一样的。
类型别名:不仅可以为对象指定类型,实际上可以为任意类型指定别名。但是不能合并声明。 泛型 泛型是可以保证类型安全的前提下,让函数等与多种类型一起工作,从而实现复用,常用于:函数、接口、类中。...泛型约束 如图,因为泛型T不一定包含属性length,所以当我们内部使用泛型变量的时候,不知道它是那种类型,所以不能操作它的属性和方法。...泛型接口 我们可以在定义接口的时候指定泛型。 在接口名称的后面添加,那么这个接口就变成了泛型接口。...使用泛型接口时,需要显式指定具体的类型,上述代码的KeyValue 实际上,JS中的数组在TS中就是一个泛型接口,当我们在使用数组时,TS会根据数组的不同类型,来自动将类型变量设置为响应的类型...当使用泛型时没有在代码中直接指定类型参数,从实际值参数中也无法推测出时,这个默认类型就会起作用。
TypeScript 笔记 参加字节跳动的青训营时写的笔记。这部分是林皇老师讲的课。(过年偷懒,项目爆肝后,重新整理笔记) 个人博客(欢迎光临):TypeScript 笔记 1....泛型:不提前指定具体类型,而是在使用时才指定类型 2.5.1 泛型函数 type IGetArr = (target: T) => T[]; function getRepeatArr(target...Array; 2.5.5 泛型约束 type IGetRepeatStringArr = (target: T) => T[]; // 限制泛型必须符合字符串...); } } 3.2.2 类型守卫 访问联合类型时,仅能访问联合类型中的交集部分。...访问联合类型时,仅能访问联合类型中的交集部分。
经过上面的例子,我们发现,其实泛型,就像是一个关于 “类型的函数” 一样,给定输入的类型变量,然后可以使用输入变量经过组合比如 T[] 、进行联合类型或交叉类型操作,来作为注解类型使用。...泛型是在调用时再限定类型 我们在定义泛型的时候,是一系列类型变量,如 T 、 U 等,这些变量实际的类型我们在定义的时候是不知道的,只有在进行泛型调用的时候,由用户给定实际的类型,所以这里有一种延迟声明类型的作用...接口泛型 在了解接口泛型之前,我们先来看一个接口是怎么写的,在 src/index.ts 里面添加如下代码: interface Profile { username: string; nickName...,接口泛型的声明和调用与函数、类泛型的类似,它允许你在接口里面定义一些属性,使用类型变量来注解,在调用时指明这个属性的类型。...类型别名泛型 因为在很多场景下,类型别名和接口充当类似的角色,所以在了解完接口泛型之后,我们有必要来了解学习一下类型别名如何结合泛型使用,和接口类似,将上面的接口泛型 Profile 用类型别名重写如下
领取专属 10元无门槛券
手把手带您无忧上云