首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

理解 TypeScript 类型拓宽

创建了一个 “重学TypeScript” 的微信群,想加群的小伙伴,加我微信 “semlinker”,备注重学TS。 本文是 ”重学TS系列“ 第 30 篇文章,感谢您的阅读!...从表达式推断变量、属性或函数结果的类型时,源类型的拓宽形式用作目标的推断类型。类型的拓宽是所有出现的空类型和未定义类型都被类型 any 替换。 以下示例显示了拓宽类型以产生推断的变量类型的结果。...但是在静态分析时,当 TypeScript 检查你的代码时,变量含有一组可能的值和类型。当你使用常量初始化变量但不提供类型时,类型检查器需要确定一个。...换句话说,它需要根据你指定的单个值来确定一组可能的值。在 TypeScript 中,此过程称为拓宽。理解它可以帮助你理解错误并更有效地使用类型注释。...这在实际场合中被拓宽了,所以导致了一个错误。 这个过程是复杂的,因为对于任何给定的值都有许多可能的类型。例如: const mixed = ['x', 1]; 上述 mixed 变量的类型应该是什么?

1.6K40

【译】不是 TypeScript 的 TypeScript -- JSDoc 的超能力

TypeScript 能够通过从使用 JavaScript 的方式正确推断来找出正确的类型。...return price * (1 + vat) } 但类型推断只能到目前为止。...激活检查 为了确保您不仅能够获得类型信息,而且在编辑器中(或通过tsc)获得实际的错误反馈,请激活源文件中的@ts-check标志: // @ts-check 如果有一个特定的行出错,但你知道这样更好,...定义对象 除了基本类型,在 JavaScript 中还经常使用到复杂类型和对象,这种情况对基于注释的类型注释也没有问题: /** * @param {[{ price: number, vat: number...特别是在输入泛型时,TypeScript 还有一些功能,但是对于很多基本任务,你可以在不安装任何编译器情况下获得很多编辑器的能力。 知道的更多?给我发一条推文。我很高兴在这里添加它们。

3.2K30
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    TypeScript介绍和使用

    静态类型 静态类型是指编译阶段就能确定每个变量的类型,这种语言的类型错误往往会导致语法错误。...这一切都源于 Javascrip 灵活的特性: 无类型约束 他没有类型约束,一个变量可能初始化时是数值,过一会儿又被赋值为对象 隐式转换 由于隐式类型转换的存在,有的变量的类型很难再运行前就确定...以下代码虽然没有指定类型,但是会在编译的时候报错: let demo = 'hellow world'; demo = 1; // index.ts(2,1): error TS2322: Type...对于初学者,我同样建议你从 AnyScript 角度入手 尽管这样做会失去 TypeScript 的类型保护优势,但是这样做确实可以降低入门门槛,让你以最快的速度上手,并且体验其独有魅力。...对于你,可能至今为止,你都还没有学习过 TypeScript 但是实际上,你已经在不知不觉中使用到了TypeScript ...

    89060

    数栈技术分享前端篇:TS,看你哪里逃~

    例:Uncaught TypeError:'xxx' is not a function⚠️ 典中典级别的错误 : ​ ​ ​ JS 就是这样,只有在运行时发生了错误才告诉我有错,但是当 TS 介入后...回答,总结,补充: 对函数参数的类型限制; 对数组和对象的类型限制,避免定义出错 例如数据解构复杂或较多时,可能会出现数组定义错误 a = { }, if (a.length){ // xxxxx }...T 为 any; 还有一些不常用,但是很易懂的: 6....useCallback无需传递类型,根据函数的返回值就能推断出类型。 但是注意函数的入参需要定义类型,不然将会推断为any!...关于TS泛型的底层实现,这个部分比较复杂,笔者还需沉淀,欢迎各位直接留言或在文章中补充!!! ​

    2K30

    数栈技术分享前端篇:TS,看你哪里逃~

    例:Uncaught TypeError:'xxx' is not a function⚠️ 典中典级别的错误 : JS 就是这样,只有在运行时发生了错误才告诉我有错,但是当 TS 介入后: 好家伙...回答,总结,补充: 对函数参数的类型限制; 对数组和对象的类型限制,避免定义出错 例如数据解构复杂或较多时,可能会出现数组定义错误 a = { }, if (a.length){ // xxxxx }...T 为 any; 还有一些不常用,但是很易懂的: 6....useCallback无需传递类型,根据函数的返回值就能推断出类型。 但是注意函数的入参需要定义类型,不然将会推断为any!...关于TS泛型的底层实现,这个部分比较复杂,笔者还需沉淀,欢迎各位直接留言或在文章中补充!!!

    2.7K10

    我 JS 写的好好的,为什么要用那么复杂的TS

    面对铺天盖地的TS怎么好怎么好的文章,项目中还没真正开始使用到TS的小伙伴,可能只是看了很多的掘金文章,或者看了一遍官方文档,脑子里基本上都是:嗯,是的,我知道TS好,我知道在变量后面加一个冒号一个类型...为什么我写了返回类型,VSCode还是提示返回值是any类型?泛型好复杂,什么时候要用泛型?接口类型定义要写在哪? 来,我们掰开揉碎一点点讲。 TS是谁写给谁看/用的?...就可以不用写成separator:string,TS会进行类型推断。...进一步,返回类型我们也可以不用定义,TS会根据split方法的返回类型来推断splitString的返回类型。 image.png 类型推论只适用于一些简单的类型,复杂的情况还是需要手动定义。...其实TS没有想象的那么复杂,TS的初衷是在帮助开发者,服务开发者,要享受TS带来的便捷和快感。

    1.1K10

    写给前端新人 - 我 JS 写的好好的,为什么要用那么复杂的TS

    面对铺天盖地的TS怎么好怎么好的文章,项目中还没真正开始使用到TS的小伙伴,可能只是看了很多的掘金文章,或者看了一遍官方文档,脑子里基本上都是:嗯,是的,我知道TS好,我知道在变量后面加一个冒号一个类型...为什么我写了返回类型,VSCode还是提示返回值是any类型?泛型好复杂,什么时候要用泛型?接口类型定义要写在哪? 来,我们掰开揉碎一点点讲。 TS是谁写给谁看/用的?...就可以不用写成separator:string,TS会进行类型推断。...进一步,返回类型我们也可以不用定义,TS会根据split方法的返回类型来推断splitString的返回类型。 ? image.png 类型推论只适用于一些简单的类型,复杂的情况还是需要手动定义。...其实TS没有想象的那么复杂,TS的初衷是在帮助开发者,服务开发者,要享受TS带来的便捷和快感。

    84120

    Typescript 2+迷你书 :从入门到不放弃

    ts不是编程语言,可以理解为一种补充(超集),让JS具有后端的部分特点(类型推断) ts不等同于js,但是可以理解为类似CoffeeScript,可以编译成js,跨平台且项目是开源的 Typescript...能提升你的代码质量,只要你愿意遵循它的套路(标准) 能简化你的代码复杂程度 ts对于ECMAScript的特性和支持一直很超前,有些特性还没发布,ts上就能使用了(各种语法糖,还能转编译到ES5乃至ES3...false; //--------------- 在TS中类型会比JS稍微多一些,记得ts中类型全部是小写---------------// let temp1: number; // 二进制,八进制.../ 应该有人想问this,但是this的范围该怎么样就怎么样,在被调用的上下文中确定 //适量的使用箭头函数会让你写起来更舒服复制代码 泛型 泛型可以简单粗暴的理解为,你传入什么类型,就返回什么类型的值...至于更深入的,其实用的并不多,我自己也没用到那些; 【d.ts和tsconfig.json的写法请看官方文档,有很详细的教程】, 安装这些就不说了 在这里汇总下我之前遇到的问题及解决方案; 引入第三方库该怎么破

    85910

    一文带你理解TS中各种高级语法

    引言 TypeScript 的重要性我不在强调了,我相信仍然会有大多数前端开发者碰到复杂类型一概使用 any 处理。...在条件类型约束中为我们提供了 infer 关键字来提供实现更多的类型可能,它表示我们可以在条件类型中推断一些暂时无法确定的类型,比如这样: type Flatten = Type extends...所谓的 Array代表的进行条件判断时要求前者(Type)必须是一个数组,但是数组中的类型我并不清楚(或者说可以是任意)。...我们类型定义时并不能立即确定某些类型,而是在使用类型时来根据条件来推断对应的类型。...之后,因为数组中的元素可能为 string 也可能为 number,自然在使用类型时 infer Item 会将待推断的 Item 推断为 string | number 联合类型。

    2.1K10

    typescript4.2新特性

    Playground中运行,然后将鼠标hover到变量上,发现ts会自动推断出x变量的类型,如下图所示: 但是我们将代码稍做改造,如下: export type BasicPrimitive = number...当你从一个或多个联合类型创建新的联合类型时,它会将这些类型转成新的扁平化联合类型,但是这样做会丢失原有的类型信息。...在TypeScript 4.2中,内部结构就变得更加智能了,你可以在 TS Playground 中切换编译版本为4.2,你会发现类型推断很完美,如下图所示: 不可跟踪的rest元素 TS中我们可以用元组类型去标识一个数组的类型...,例如: let a: [string, number, boolean] = ['hello world', 10, false]; 但是以上写法,元组中参数的个数是固定的,但如果number的数量是不固定的呢...你可能想要的是:告诉TS,以下划线开头的变量表示未使用变量,只负责占位,请不要报错。 此时,你只需要将ts版本升级为4.2即可(这确实是一个很重要的更新)。

    89810

    TypeScript是什么,为什么要使用它?

    但是否能通过JavaScript创建大型复杂Web应用系统呢?可能那么容易。 不过值得庆幸的是,我们还有一个解决方案TypeScript。 在过去的几年中,TypeScript的受欢迎程度一直在增长。...所以,TypeScript也同样可以用于完全相同的目的,但在复杂企业项目中的服务端的表现更令它大放异彩。 什么是类型,它们在TypeScript中如何工作?...类型简介 类型是在我们运行程序之前通过在代码中描述我们计划如何使用数据来区分正确程序的方法。它们可以从简单的类型(如数字和字符串) 到为我们的问题域完美建模的复杂结构。...编程语言分为两类:静态类型或动态类型。 在使用静态类型的语言中,变量的类型在编译时必须是已知的。如果我们声明一个变量,编译器应该知道(或可推断) 该变量是数字、字符串或布尔值。...TypeScript中的类型可以是隐式的也可以是显式的。如果您未明确编写类型,则编译器将使用类型推断来推断您正在使用的类型。

    1.6K20

    Swift5.7 扩展不透明类型(some)到泛型参数

    介绍Swift 中的泛型语法是为了类型通用性设计,这种通用性允许在函数输入和输出时,使用复杂的类型集合来表达,前提是类型必须前后一致。...func f(_ p: _T) { }与不透明结果类型不同,调用方通过类型推断确定不透明参数类型的真实类型。...不透明结果类型和不透明参数类型其实很相似,都是使用some 关键字来修饰,前者用在返回结果中,后者用在参数中。本质都是表达遵循同一协议类型的泛型类型。...针对上述不同参数的报错,有一种可能的解决方案是:对于可变泛型,可以将隐式泛型参数改为泛型参数包,也就是模版中P改为P...,此时约束从遵循同一类型的泛型变成支持不同类型的泛型(感觉支持了所有类型?...总结通过当前提议 SE-0341,你应当知道:Swift5.7 通过运用 some 到泛型参数类型,是为了去除泛型模块声明的冗余表达;some 对应的是与之等价的泛型模版表达式;内部通过类型推断,确定真实的不透明参数类型所对应的类型

    2.9K141

    Typescript配合React实践

    如果按部就班的写React就体会不到使用ts的乐趣,如果多对代码进行优化,进行重构,在业务中实践比较好的一些方案就会体会到ts真正的乐趣,但是ts也在过程中给我带来了痛苦,在本文的最后会具体展开一下。...但是ts的静态类型检查就帮你解决了这个问题,对于每一个父组件没有传递的值来说,都会提示错误。而且ts的报错是在编译时,不是在运行时。...经历了几次重构自己和重构其他人代码的时候,我现在对于ts的心态就是:“我可能以后的前端生涯离不开这玩意儿了”。...typescript的基本类型,但是如果有自己定义的复杂类型,比如说下面这种: interface IUser { name: string; id: number: age: number; ....这个时候我们可是使用泛型,把类型传递进来(也可以说是通过typescript的类型推断来推断出来)。

    94120

    JSDoc ,一个可替代 TypeScript 的方案?

    其中一些包括: 缺乏静态类型和严格的类型检查:JavaScript非常宽容,允许将参数传递给不接受它的函数,可以省略必需的值等。这在静态类型语言中是不允许的,因为会在编译时出错。...与JSDoc不同,这些类型在代码本身中结束,并且不受强制执行。 类型推断:TypeScript 可以从其值推断类型。这有助于减少显式类型注解,使代码库更简洁。...你也可以在连字符(-)后面加上参数的描述。 关键字 @returns 用于定义函数返回的内容。这对于大型函数特别有用。可能很难浏览所有的代码,包括早期返回,以确定函数的预期行为。...构造函数 类中创建的所有方法和变量 我们使用 @params 关键字来提供需要传递给构造函数的参数的类型和描述。类中的方法与函数的类型方式相同,这在前一节中已经介绍过。...从JSDoc生成.d.ts文件 在TypeScript中, .d.ts 文件代表包含所有 .ts 文件都可以访问的类型声明文件。

    83710

    TypeScript中那几个奇怪的知识点

    根据你传入niubi这个方法的参数对象来确定的,当我们传入的a是字符串,那么T就为string.返回的就是一个item为字符串的数组 class Peter { niubi(a: T): T[...“number”分配给类型“string[]”, 因为此时TS推断出来,res必定为一个数组,且里面的item是一个字符串. res = ["2"]则不会报错 泛型可以说是TS里面的一个难点,但是其实它只是一个可变的类型变量...再接着传入到真正的请求函数中 // 在 axios.ts 文件中对 axios 进行了处理,例如添加通用配置、拦截器等 import Ax from '....>数据 这样做的意义,提取可变的数据类型data,让TS推断出这个接口返回的数据是怎么样的。...这里是为了接下来的类型兼容性打基础,TS里面最重要的就是type类型,类型系统就是它的核心。

    1.2K10

    【TypeScript】入门基础

    类型注解和类型推断在上面的例子中,我们在变量后面用:来显式地注解类型。这称为类型注解。TypeScript还可以进行类型推断,根据上下文自动推断变量的类型,这在上面的示例中是可行的。5....类型检查TypeScript的一个主要特点是静态类型检查。它在编译时检查类型错误,帮助你发现并解决潜在的错误,从而提高代码质量和可维护性。6....在命令行中,导航到TypeScript文件所在的目录,然后运行以下命令:tsc filename.ts这将生成一个名为filename.js的JavaScript文件。7....高级类型TypeScript提供了许多高级类型特性,如联合类型、交叉类型、泛型等。这些功能可以更好地定义和处理复杂的数据结构和函数签名。8....上面是简要的TypeScript教程,涵盖了一些基本的概念和用法。如果你想深入学习TypeScript,请查阅官方文档和更多高级教程。祝你在TypeScript的学习过程中取得成功!

    32430

    10 个关于 TypeScript 的小技巧

    然后 TypeScript 根据作为 addEventListener 方法中第一个参数的“click”文字确定事件的类型。...除了 querySelector 之外,另一个流行的例子是 Array.find 方法,其结果可能是不确定的。 您并非总能找到想要的东西:-) 4、“TS,我告诉你,在这里!”...至于将实际类型添加到旧的 JavaScript 代码中,实际上通常可以不这样做。只有在您有一些令人讨厌的代码(例如, 为同一变量分配不同类型的值,您可能会遇到问题。...更准确地说:它将根据您退回或未退回的商品推断出退货价值。 幸运的是,TSLint可以为您提供帮助。...这是应该由机器处理的任务!? 有两种选择: http://www.json2ts.com http://www.jsontots.com 是其中的一些,但是坦率地说,它们的服务器通常不可用。

    1.3K10

    进阶实现智能类型推导的简化版Vuex,手把手带你实现。

    之前几篇讲TypeScript的文章中,我带来了在React中的一些小实践 React + TypeScript + Hook 带你手把手打造类型安全的应用。...现在有个问题,我们现在的写法里没有任何地方能体现出payload的类型,(这也是Vuex设计所带来的一些缺陷)所以我们也只能写成any,但是我们本文的目标是类型安全。...我们新增一个辅助Ts推断的方法,这个方法原封不动的返回dispatch函数,但是用了as关键字改写它的类型,我们需要把ActionTypes作为泛型传入: export default class Vuex...,直接把泛型A交给第一个形参action就好了,由于ActionTypes是联合类型,Ts会严格限制我们填写的action的类型必须是AddType或者ChatType中的一种,并且填写了AddType...的类型安全 此时虽然store.diaptch完全做到了类型安全,但是在声明action传入vuex构造函数的时候,我不想像这样手动声明, const store = new Vuex({ state

    76651
    领券