TypeScript是JavaScript的超集,为JavaScript的动态类型世界引入了静态类型。这使开发人员能够在开发过程中捕获潜在的错误并提高代码的可读性。...在TypeScript中,变量可以明确或隐式地定义类型,并且该语言支持各种原始类型。让我们深入了解每种原始类型,探索示例,并了解显式和隐式类型之间的区别。...隐式类型推断:隐式类型推断,也称为类型推断,允许TypeScript根据分配的值推断类型。...isActive = true; // TypeScript推断为 'boolean'隐式类型推断减少了冗长性,使代码更为简洁。...结论了解TypeScript中的原始类型以及何时使用显式或隐式类型对于编写健壮且易于维护的代码至关重要。显式类型声明提供清晰度并在早期捕获错误,而隐式类型推断则促进了简洁的代码。
let x; // 隐式 'any' let y = []; // 隐式 'any[]' let z: any; // 显式 'any'....any 错误 这样做的一个很大的好处是,当使用--noImplicitAny运行时,你将看到较少的隐式any错误。...隐式any错误只会在编译器无法知道一个没有类型注解的变量的类型时才会报告。...示例 function f3() { let x = []; // 错误:当变量'x'类型无法确定时,它隐式具有'any[]'类型。...x.push(5); function g() { x; // 错误:变量'x'隐式具有'any【】'类型。
现象 typescript中使用变量作为索引来访问未知类型,例如泛型对象成员时,会报错TS7053 function doSomething(obj: T, prop: string) {...obj[prop] // 报错TS7053 } 报错如下: TS7053: Element implicitly has an ‘any’ type because expression of type...下例中的变量P相当于类型 “x” | “y” type Point = { x: number; y: number }; type P = keyof Point; 如果类型包含number或string...类型的索引签名,keyof则会返回number或string 下例中变量A相当于类型 number type Arrayish = { [n: number]: unknown }; type A =...keyof Arrayish; 下例中变量M相当于类型 string | number type Mapish = { [k: string]: boolean }; type M = keyof
当Typescript严格模式设置为on时,它将使用strict族下的严格类型规则对项目中的所有文件进行代码验证。规则是: 不允许变量或函数参数具有隐式any类型。...2.noImplicitAny 此规则不允许变量或函数参数具有隐式any类型。...请注意,如果导入了非Typescript库,这也会引发错误,因为导入的库的类型是any。...版的一大麻烦,需要专门定义第三方库接口类型 3.noImplicitThis 此规则不允许this上下文隐式定义。...,非严格模式下不会校验参数类型和数量,运行代码时,Typescript和环境(可能是浏览器)都不会引发错误: // Typescript非严格模式 function sum (num1: number,
如何使用 TypeScript 定义函数式组件 函数式组件通常接受一个 props 参数,返回一个 JSX 元素或者 null。...使用 JSX.Element 使用 JSX.Element 类型作为函数式组件的返回值类型,当组件的返回值不是 JSX.Element 类型时,TypeScript 就会提示错误。...直接定义完整类型 由于 React 组件包含子元素时,会隐式传递一个 children 属性,导致定义的参数类型出错,因此我们可以直接定义一个完整的参数接口,包含了 children 属性的类型: type...函数式组件返回值不能是布尔值 当我们在函数式组件内使用「条件语句」时,如果返回的是非 JSX 元素或者非 null 的值,React 将会报错: const ConditionComponent = (...无法为组件使用 Array.fill() 填充 当我们的组件直接返回 Array.fill() 的结果时,TypeScript 会提示错误。
简言之,就是把类/接口看作具有隐式类型参数this的泛型,并加上其所在类/接口相关的类型约束 Consider every class/interface as a generic type with...出了当前类/接口的上下文,this的类型就是A,类型兼容性等与泛型一致 所以,this类型就像一个带有类派生关系约束的隐式类型参数 三.Function this type 除了类/接口外...,this类型还适用于普通函数 不同于class this type通常隐式发挥作用(如自动类型推断),function this type大都通过显式声明来约束函数体中this值的类型: This-types...例如: declare class C { m(this: this); } let c = new C(); // f 类型为 (this:C) => any let f = c.m; // 错误 The...因此,目前function this type与class this type隐式检查都很弱(比如未显式指定this类型的成员方法并不默认具有class this type约束) class C {
然后,你可以使用 TypeScript 类型检查器来捕获许多常见错误,例如拼写错误、忘记处理null和undefined等等。...标记 逻辑表达式中改进的未调用函数检查 解构变量可以显式标记为未使用 可选属性和字符串索引符号之间的宽松规则 声明缺失的帮助函数 破坏性更新 更智能的类型别名保留 TypeScript 有一种为类型声明新名称的方法...元组类型中的前导 / 中间剩余元素 在 TypeScript 中,元组类型用于对具有特定长度和元素类型的数组进行建模。...这也使得现有 JavaScript 代码转换为 TypeScript 变得更容易。 然而,放松限制也意味着错误拼写一个显式声明的属性变得容易得多。...现在会发出一个隐式的any错误。
下面就来看看 TypeScript 4.2 带来了哪些新内容。 元组类型的 Rest 元素可放置于元组中的任何位置 在 TypeScript 中,元组类型用于建模具有特定长度和元素类型的数组。...在以前的版本中,TypeScript 仅允许...rest 元素位于元组类型的最后一个位置。但现在,rest 元素可以在元组中的任何位置出现——只不过有一点限制。.../pull/42284 模板字面量表达式具有模板字面量类型 在 TypeScript 4.1 中我们引入了一种新的类型:模板字面量类型。...TypeScript 4.2 包含一些重大更改,但我们认为它们应该不会太影响升级过程。 模板字面量表达式具有模板字面量类型 如前所述,模板字符串表达式现在以模板字面量类型开始。...yield 表达式但没有在上下文中类型化它(也就是说 TypeScript 不知道类型是什么)时,TypeScript 现在将发出一个隐式的 any 错误。
"alwaysStrict": true, // 在代码中注入'use strict' "noImplicitAny": true, // 不允许隐式的any类型 "strictNullChecks...类的实例属性必须初始化 "strictBindCallApply": true, // 严格的bind/call/apply检查 "noImplicitThis": true, // 不允许this有隐式的...这是因为 this 隐式具有 any 类型,如果没有指定类型注解,编译器会提示“"this" 隐式具有类型 "any",因为它没有类型注释。”。...解决方法有2种: 指定 this 类型,如本代码中为 HTMLElement 类型: HTMLElement 接口表示所有的 HTML 元素。...使用 --noImplicitThis 配置项: 在 TS2.0 还增加一个新的编译选项: --noImplicitThis,表示当 this 表达式值为 any 类型时生成一个错误信息。
TypeScript 还会推断函数的返回类型,但是如果函数体比较复杂,还是建议清晰的显式声明返回类型。 我们可以在参数后添加一个?...这是因为 TypeScript 可以通过类型推断确认它的类型为 HTMLAnchorElement。 但是如果我们需要通过 class 或 id 来选择一个 DOM 元素呢?...// tsconfig.json "strict": true 严格模式实际上就意味着:禁止隐式 any 和 严格的空检查。...禁止隐式 any 在下面的函数中,TypeScript 已经推断出参数 a 是 any 类型的。...console.log(a.name); } logName(97); 打开 noImplicitAny 选项后,如果我们没有显式地声明 a 的类型,TypeScript 将立即标记一个错误: //
为了解决该错误,显示地为event参数声明类型。比如说,在input元素上,将处理change事件声明类型为React.ChangeEvent 。...逃生舱any 如果你不想正确地为事件声明类型,你只是想摆脱错误,那么可以将事件类型设置为any。...这样就解决了错误,因为现在事件被显式地设置为any类型,而之前是隐式地设置为any类型。 然而,一般来说我们最好避免使用any类型。...确定类型 下面是一个如何确定表form元素上的onSubmit事件类型的例子。...TypeScript总是能够推断出内联事件处理器的事件类型,因为你已经安装了React的类型定义文件。
---- 类型断言 类型断言使我们可以覆盖 TypeScript 为存储位置计算的静态类型,这对于解决类型系统的限制很有用。...这种覆盖方式比类型声明要安全得多,因为你可以做的事情少得多。TypeScript 的类型必须能够分配给注释的类型。...1type Dict = {[k:string]: any}; 2 3function getPropertyValue(dict: unknown, key: string): any { 4...== null && key in dict) { 5 // %inferred-type: object 6 dict; 7 8 // @ ts-ignore:元素隐式具有“...any”类型,因为 9 // 类型'string'的表达式不能用于索引类型'{}'。
强类型语言中不允许任意的隐式类型转换,而弱类型语言则允许任意的数据隐式类型转换 变量类型允许随时改变的特点,不是强弱类型的差异 静态类型与动态类型(类型检查) 静态类型:一个变量声明时它的类型就是明确的...const foo:[string,number] = ['foo',123];//第一个元素必须是字符串 第二个元素是数字 对象类型 /* 对象类型 @flow */ //定义对象的成员类型方式如下...缺点一:语言本身多了很多概念 缺点二:项目初期,会增加一些成本 TypeScript 属于渐进式的 TypeScript 最终会编译成JavaScript并且支持到ES3的标准 yarn add typescript...各个元素的类型不必要完全相同 const tuple:[number,string] = [18,''];//类型不相符 或者超出元素的数量都会报错 const [age,name] = tuple...func2 : (a:number,b:number) => string = function(a:number,b:number):string{ return 'func2'; } 隐式类型推断
因为弱类型在运行过程中需要对变量类型进行隐式转换(注:比如你将某类型的值赋值给一个变量,该变量需要经过大脑思考一下,你给它的是一个什么类型的值,思考完毕之后它才会接纳你的值,并给你的值安排位置),在分配内存时...]; 以上示例指定了数组元素必须为 number类型,如果指定其它类型,会给予错误提示: let arr: number[] = [1, 2, 3,"四"]; 另外还有一种定义数组的方法即泛型数组,在这儿先不涉及...元组类型可以用于表示元素类型不同的数组,但前提是你要知道元素的数量与类型。 如下,我定义了第一个元素为 string类型,第二个元素为 number类型的元组。...,"TypeScript"];// Error ---- 任意值类型(any) any类型就比较厉害了,因为它可以表示任意类型,可见它是多么的没有原则!...let arr:any[] = [1,true,2, "TypeScript"];let str:any = "你过来啊!"
从 TypeScript 2.0 开始,在函数和方法中我们可以声明 this 的类型,实际使用起来也很简单,比如: function sayHello(this: void) { // this:...; // 'this' implicitly has type 'any' because it does not have a type annotation....this.removeEventListener("click", handleClick); } 对于以上代码,TypeScript 编译器会有以下错误提示:this 隐式具有 any 类型,这是因为它没有类型注解...为了解决这个问题,我们就可以显式指定 this 参数的类型: const button = document.querySelector("button"); button?....,表示当 this 表达式值为 any 类型的时候,生成一个错误信息。
类型 TypeScript共有13种基本类型,除了JavaScript所有的7种之外,还有: Array:数组,表示一组类型相同的元素 Tuple:元组,表示一组固定数量的元素(不要求元素类型相同),如二元组...,三元组 Enum:枚举,常量集合 Any:任意类型,表示未知类型,比如动态内容(用户输入、或第三方类库)或不知道类型的东西(混合类型数组),可以声明any类型绕过类型检查 Void:空类型,表示没有类型...如果指定了数值,后一项的值在此基础上递增,否则要求之后的项都要指定值(默认的数值递增机制应付不了了) Any类型相当于局部的类型检查开关,这在TypeScript与JavaScript代码并存的项目中很有意义...;避免隐式访问window.name) P.S.特殊的,建议开启--strictNullChecks选项,此时Undefined和Null只允许赋值给Void以及各自对应的类型 P.S.关于Never作为类型保护的应用...类似于其它语言里的强制类型转换(type casting),区别在于类型断言只是编译时的,不像类型转换一样具有运行时影响: A type assertion is like a type cast in
领取专属 10元无门槛券
手把手带您无忧上云