一、背景 有些同学提出“ArrayList的public T[] toArray(T[] a) 带参数的方法支持泛型可以返回参数类型的数组,public Object[] toArray() 方法为啥不利用泛型返回...List的泛型类型的数组”?...但是我们看一下ArrayList真正存储对象的变量: transient Object[] elementData; 它的类型为Object数组。 因此从源码来看,返回值必然是Object数组了。...一方面ArrayList真正存储对象的变量: transient Object[] elementData; 另外一方面创建ArrayList的时候,并不一定指定泛型类型的。...(2)这点又让我想到了fastjson的json反序列化时调用泛型的函数来转成对象。
dp是二维数组。有代码。
,查找 str1.includes("b"); // 是否在字符串里查到了参数的值,返回布尔值 str1.startsWith("b", 0); // 从头部开始,是否在字符串里查到了参数的值,返回布尔值...str1.endsWith("b", 1); // 从尾部开始,是否在字符串里查到了参数的值,返回布尔值 // 字符串的unicode码查找 str1.charCodeAt("1"); // "b"..."; str3.trim( ); // "1233" /* 值类型数据: number string null undefined boolean 值类型数据比较,值类型相同,值长得一样,就相等...引用型数据: object 引用型数据比较,是比较内存地址 */ // 引用型数据this指向 function fn(){ console.log(this); } let obj = { a: fn..., c, a, b, c" 相当于arr1.toString() 方法内不传值,把数组整体放入字符串 arr1.join(""); // "abcabc" 方法内传入空字符串,删除数组内逗号相连接 arr1
基本类型 number:数字 string:字符串 boolean:布尔 数组 object: 对象 null 和 undefined null和undefined是所有其他类型的子类型,它们可以赋值给其他类型...,并且数组中每一项的类型确定 let person: [string, number] = ["John", 25]; any类型: any类型可以绕过类型检查,因此,any类型的数据可以赋值给任意类型...泛型约束(Generic Constraints) 使用 extends 关键字对泛型进行约束,限制泛型参数必须满足某些条件。...通过泛型约束,我们可以在函数内部使用泛型参数的特定属性或方法。 这些类型运算符可以帮助开发者更灵活地操作和组合类型,提供了更强大的类型系统支持。...(2, 3); // 返回 6 在这个示例中,函数multiply接受两个参数,都是number类型,并且返回值也是number类型。
TypeScript—类型推论和类型断言 11. TypeScript—枚举 12. TypeScript—泛型 13. TypeScript—字符串字面量类型 14....用数组泛型表示数组 我们也可以使用数组泛型Array 来表示数组: let nums: Array = [1, 1, 2, 3, 5]; 关于泛型,可以下面会具体讲解...这里主要是想介绍数组泛型可以定义数组。...TypeScript—泛型 泛型是指在定义函数、接口或类的时候,不预先指定具体的类型,而在使用的时候再指定类型的一种特性。...这段代码编译不会报错,但是一个显而易见的缺陷是,它并没有准确的定义返回值的类型。Array 允许数组的每一项都为任意类型。但是我们预期的是,数组中每一项都应该是输入的 value 的类型。
对象或数组转联合类型的思路都是类似的,一个数组转联合类型用 [number] 作为下标: ['1', '2', '3']['number'] // '1' | '2' | '3' 对象的方式则是 [keyof...T] 作为下标: type ObjectToUnion = T[keyof T] 再观察这道题,联合类型每一项都是数组,分别是 Key 与 Value,这样就比较好写了,我们只要构造一个 Value...首先因为返回值是个递归对象,递归过程中必定不断修改它,因此给泛型添加第三个参数 R 存储这个对象,并且在递归数组时从最后一个开始,这样从最内层对象开始一点点把它 “包起来”: type TupleToNestedObject...,这里还有一个特殊情况,即字符串中通过这种方式申明每一项,会自动笛卡尔积为新的联合类型: type BEM<B extends string, E extends string[], M extends...联合类型,如何从对象或数组生成联合类型,字符串模板与联合类型的关系。
上例中,我们使用 type 定了一个字符串字面量类型 EventNames,它只能取三种字符串中的一种。 注意,类型别名与字符串字面量类型都是使用 type 进行定义。...7.1、简单的例子 首先,我们来实现一个函数 createArray,它可以创建一个指定长度的数组,同时将每一项都填充一个默认值: function createArray(length: number...result[i] = value; } return result; } createArray(3, 'x'); // ['x', 'x', 'x'] 上例中,我们使用了之前提到过的数组泛型来定义返回值的类型...这段代码编译不会报错,但是一个显而易见的缺陷是,它并没有准确的定义返回值的类型: Array 允许数组的每一项都为任意类型。...但是我们预期的是,数组中每一项都应该是输入的 value 的类型。
这篇文章跟大家分享学习ts的又一个重难点「泛型」。在ts中,得泛型者,得天下! 1 什么是泛型 整个ts的学习,其实就是各种数据类型的类型约束的学习。...那么问题就来了,不同的数组调用map,数组的每一项数据类型必然不一样,我们没办法简单的使用某一种数据类型来准确的约束数组的每一项。...泛型,即为更广泛的约束类型。 仔细观察下面的三组案例,思考一下如果我们要自己描述Array类型与数组中的map方法应该怎么做?...T作为泛型变量的含义为:我们在定义约束条件时,暂时还不知道数组的每一项数据类型到底是什么,因此我们只能放一个占位标识在这里,待具体使用时再来明确每一项的具体类型。...回调函数callbackfn的第一个参数就是数组的每一项,正好就是定义数组时传入的泛型变量T,不过回调函数会返回一个新的数组项,因此我们需要重新定义一个新的泛型变量来表达这个新数组,即为U。
TS系列地址: 21篇文章带你玩转ts # 泛型 泛型(Generics)是指在定义函数、接口或类的时候,不预先指定具体的类型,而在使用的时候再指定类型的一种特性。...简单的例子§ 首先,我们来实现一个函数 createArray,它可以创建一个指定长度的数组,同时将每一项都填充一个默认值: function createArray(length: number, value...result[i] = value; } return result; } createArray(3, 'x'); // ['x', 'x', 'x'] 上例中,我们使用了之前提到过的数组泛型来定义返回值的类型...这段代码编译不会报错,但是一个显而易见的缺陷是,它并没有准确的定义返回值的类型: Array 允许数组的每一项都为任意类型。但是我们预期的是,数组中每一项都应该是输入的 value 的类型。...,需要定义泛型的类型。
Name其实就是string的别名,类型() => string,一个函数返回一个字符串,这种格式就是类型NameResolver,NameOrResolver是一个联合类型,之前说过。...字符串字面量类型 字符串字面量类型,用来约束取值职能是某几个字符串其中的一个字符串,举个: type EventSupport = 'click' | 'scroll' | 'mouseEnter' function...可以利用下标修改值,但是值必须是相同类型的 元组可以越界,越界的元素只能是你定义元组的时候的联合类型,不能是其他类型,越界的元素不能修改 .....泛型是指在定义函数、接口、类的时候,不预先指定具体类型,而在使用的时候再指定类型的一种特性。...基本定义 我们实现一个 createArray函数,他可以创建一个指定长度的数组,同事将每一项都填充一个默认值: function createArray(length: number, value:
虽然JS数组和在其他语言中一样,是一个有序列表,但不同的是其每一项可以保存不同类型的的数据,而且其数组大小是可以动态调整的。 2..../ 3 console.log(arr[1]); // undefined 会返回一个长度是传入值且每一项都是undefined的数组。...,长度为0 4.2 Array原型对象的方法 Array原型对象的方法分为四类: 修改器方法 访问方法 迭代方法 泛型方法(已弃用) 4.2.1 修改器方法 修改器方法会改变调用它们的对象自身的值。...4.2.4 泛型方法 泛型方法是非标准,并且已弃用,有可能不久就会移除。 需注意的是此方法同时有跨浏览器问题. 但是 Github上有可用的shim。...; } 这种方法能够行得通,但不够简洁,JavaScript 1.6 中引入了一个泛型化的简写形式: if (Array.every(str, isLetter)) { console.log("The
前言 TypeScript是一种由微软开发的开源编程语言,它是JavaScript的一个超集,添加了静态类型、类、接口和泛型等特性。...如果需要数组中的元素可以是多种类型,可以使用联合类型,例如 (number | string)[] 表示数组中的元素可以是数字或字符串。...); // 调用greeter函数并打印结果 泛型 在 TypeScript 中,泛型(Generics)是一种创建可重用组件的方式,这些组件可以处理多种数据类型,而不是单一的数据类型。...泛型允许我们定义函数、接口或类,其中的类型参数可以在使用这些组件时指定。这使得代码更加灵活和可维护,因为我们可以编写一次代码,然后在多种数据类型上重复使用。...return arg;:函数返回与参数相同的值,其类型也是 T。 接着,创建了一个 myIdentity 变量,并将 identity 函数赋值给它。这里使用了另一种语法来指定泛型类型参数。
let arr: number[] = [1, 2, 3]; 上面示例中,数组arr的类型是number[],其中number表示数组成员类型是number。...let arr: Array; 这种写法本质上属于泛型,这里只要知道怎么写就可以了,详细解释参见《泛型》一章。...由于数组成员的索引类型都是number,所以读取成员类型也可以写成下面这样。...注意,readonly关键字不能与数组的泛型写法一起使用。...实际上,TypeScript 提供了两个专门的泛型,用来生成只读数组的类型。
数组类型 let arr1: Array = [1,2,3,4] // 使用尖括号形式声明(数组泛型) console.log(arr1); let arr2: number[]...,不同的是,元组每一项的数据类型可以不同(数组使用any类型也可以实现每一项类型不同) 每一项的元素类型必须一致,否则编译出错 let tuple1: [string, number, boolean...= [1, true, 'hello'] console.log(anyArr); let anyArr2: Array = [false, 0x1234, 'world'] // 泛型声明...) void类型表示没有任何类型,func无返回值时可以使用此类型。...never类型是那些总是会抛出异常,或者根本就不会有返回值的函数返回值类型。
本文会侧重使用 React Hook 作为示例,当然大部分类型知识都是通用的。...: boolean; /** 数组类型 */ names: string[]; /** 用「联合类型」限制为下面两种「字符串字面量」类型 */ status: "waiting" | "...: React.CSSProperties; // ✅ 推荐 在内联 style 时使用 // ✅ 推荐原生 button 标签自带的所有 props 类型 // 也可以在泛型的位置传入组件 提取组件的...(false); toggle(false) toggle(true) 如果初始值是 null 或 undefined,那就要通过泛型手动传入你期望的类型。...否则,你的每一项都会被推断成是「所有类型可能性的联合类型」,这会影响用户使用。
例如:将一个联合类型的变量指定为一个更加具体的类型(但不能指定为联合类型中不存在的类型): // 使用联合类型时,必须使用这些类型共有的属性才行,但使用类型断言使其确定为某一种类型,就没有了此限制。...联合类型使用 | 分隔每个类型,表示可以赋值为其中的一种。...**方法一:**使用「类型 + 方括号」来表示数组(类型可以是any): let fibonacci: number[] = [1, 1, 2, 3, 5]; //数组的值只能是number类型 let...list: any[] = ['Xcat Liu', 25]; //数组的值可以是任意类型 数组的项不允许出现其他类型,并且数组的一些方法的参数也不能出现其他类型,如:push()。...**方法二:**数组泛型: let fibonacci: Array = [1, 1, 2, 3, 5]; 方法三:用接口描述数组: interface NumberArray {
'C', 'B'] | ['B', 'A', 'C'] | ['B', 'C', 'A'] | ['C', 'A', 'B'] | ['C', 'B', 'A'] 看到这题立马联想到 TS 对多个联合类型泛型处理是采用分配律的...但触发的条件必须存在两个泛型,而题目传入的只有一个,我们只好创造第二个泛型,使其默认值等于第一个: type Permutation 这样对本题来说,会做如下展开: Permutation...Length of String 实现 LengthOfString 返回字符串 T 的长度: LengthOfString // 3 破解此题你需要知道一个前提,即 TS 访问数组类型的...:递归时如果需要存储临时变量,用泛型默认值来存储。...本题我们就用 Result 这个泛型存储打平后的结果,每次拿到数组第一个值,如果第一个值不是数组,则直接存进去继续递归,此时 T 自然是剩余的 Rest;如果第一个值是数组,则将其打平,此时有个精彩的地方
: string; // 可选属性 [key: string]: any; // 对象可以有任意属性,键是字符串类型的,值是任意类型的 } 2.3 函数类型 /* 1 */ function... = Array; 2.5.5 泛型约束 type IGetRepeatStringArr = (target: T) => T[]; // 限制泛型必须符合字符串...(demo,实际上使用应该不会只限制成字符串这种) 2.5.6 泛型参数默认 type IGetRepeatArr = (target: T) => T[]; 2.6 其他类型...); } } 3.2.2 类型守卫 访问联合类型时,仅能访问联合类型中的交集部分。...访问联合类型时,仅能访问联合类型中的交集部分。
攀爬TS之路(八) 泛型 泛型是指在定义函数、接口或类时,不预先指定具体的类型,而是在使用的时候再指定类型的一种特性。 泛型的简单使用 先来一个简单的例子,加深了解。...目标:创建一个函数createArr,实现创建一个指定长度的数组。第一个参数是数组,第二个参数是数组每一项的值。 首先,我们想要实现这个功能,第一时间可能想到的是使用任意类型any来实现。...不对劲的地方: 数组是any类型 数组的元素也都是any类型 但是,我们想要的效果应该是无论传什么类型,就得到对应类型。使用泛型就能很简单地实现这种效果。...也可以不手动指定,TS的类型推论会自动得到结果。 createArr(4, 1) 多个类型参数 定义泛型的时候,可以使用多个不同的字母来表示多个类型参数。...在我们使用泛型变量的时候,因为不知道该变量是哪种类型(具体是哪种类型只有调用函数后才知道),所以就不能操作它的属性和方法。
extends Animal { bark(): void; } // Dog => { name: string; bark(): void } 泛型约束 在书写泛型的时候,我们往往需要对类型参数作一定的限制...P是带参数T的泛型类型,其表达式和A1,A2的形式完全相同,A3是泛型类型P传入参数'x' | 'y'得到的类型,如果将'x' | 'y'带入泛型类的表达式,可以看到和A2类型的形式是完全一样的,那是不是说明...如果extends前面的参数是一个泛型类型,当传入该参数的是联合类型,则使用分配律计算最终的结果。...string : number => number 然后将每一项代入得到的结果联合起来,得到string | number 总之,满足两个要点即可适用分配律:第一,参数是泛型类型,第二,代入参数的是联合类型...“keyof A” type A2 = Pick Pick的意思是,从接口T中,将联合类型K中涉及到的项挑选出来,形成一个新的接口,其中K extends
领取专属 10元无门槛券
手把手带您无忧上云