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

Typescript是不是还不够聪明,不能从一个空对象中推断出后来添加的属性?

Typescript是一种静态类型的编程语言,它是JavaScript的超集,为JavaScript添加了静态类型检查和其他一些特性。在Typescript中,类型推断是通过分析代码中的上下文来确定变量的类型。对于空对象,Typescript无法推断出后来添加的属性的类型。

这是因为在Typescript中,对象的类型是在声明时确定的,而后续添加的属性并不会改变对象的类型。如果要在空对象中添加属性,并希望Typescript能够推断出属性的类型,可以使用类型断言或者显式声明属性的类型。

类型断言是通过使用as关键字将一个值断言为特定的类型,从而告诉Typescript该属性的类型。例如:

代码语言:typescript
复制
let obj = {} as { name: string };
obj.name = "John";

在上面的例子中,我们使用类型断言将空对象{}断言为具有name属性的对象,并给name属性赋值。

另一种方法是显式声明属性的类型。例如:

代码语言:typescript
复制
let obj: { name: string } = {};
obj.name = "John";

在上面的例子中,我们显式声明了obj对象的类型为具有name属性的对象,并给name属性赋值。

总结起来,Typescript在空对象中无法推断出后来添加的属性的类型,但可以通过类型断言或显式声明属性的类型来解决这个问题。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

理解 TypeScript 类型拓宽

从表达式推断变量、属性或函数结果类型时,源类型拓宽形式用作目标的推断类型。类型拓宽是所有出现类型和未定义类型都被类型 any 替换。 以下示例显示了拓宽类型以产生推断变量类型结果。...尽管 TypeScript聪明,但它无法读懂你心思。它不能保证 100% 正确,正如我们刚才看到那样疏忽性错误。...前面的 mixed 示例说明了数组问题:TypeScript 应该推断 mixed 类型为元组类型吗?它应该为 mixed 推断出什么类型?对象也会出现类似的问题。...对于对象TypeScript 拓宽算法会将其内部属性视为将其赋值给 let 关键字声明变量,进而来推断其属性类型。因此 obj 类型为 {x:number} 。...它需要推断一足够具体类型来捕获错误,但又不能推断出错误类型。它通过属性初始化值来推断属性类型,当然有几种方法可以覆盖 TypeScript 默认行为。

1.6K40

TypeScript 演化史 — 第七章】映射类型和更好字面量类型推断

转换后属性组成新类型。 使用映射类型,可以捕获类型系统类似 Object.freeze() 等方法效果。冻结对象后,就不能添加、更改或删除其中属性。...和 y 两属性 Point 接口,咱们定义了另一接口FrozenPoint,它与 Point 相同,只是它所有属性都被使用 readonly 定义为只读属性。...虽然上面的示例可以正确地编译和工作,但它有两大缺点 需要两接口。除了 Point 类型之外,还必须定义 FrozenPoint 类型,这样才能将 readonly 修饰符添加到两属性。...对于希望在应用程序冻结每种类型对象,咱们就必须定义一包装器函数,该函数接受该类型对象并返回冻结类型对象。没有映射类型,咱们就不能以通用方式静态地使用 Object.freeze()。...咱们可以更新任意多个属性,这使得setState方法成为 Partial 很好用例。 Lodash:pick 函数从一对象中选择一组属性

3.8K40

初探 TypeScript函数基本类型泛型接口类内置对象

(类型推断:如果没有明确指定类型,那么 TypeScript 会依照类型推论(Type Inference)规则推断出类型。)...有时候不同类之间可以有一些共有的特性,这时候就可以把特性提取成接口,用 inplements 关键字来实现,这个特性大大提高了面向对象灵活性 可选属性好处:可能存在属性进行定义,捕获引用了一不存在属性错误...;他有一调用签名,参数列表和返回值类型函数定义,参数列表里每一参数都需要名字和类型,函数参数名不需要与接口里定义名字相匹配,如果你没有指定参数类型,TypeScript 类型系统会推断出参数类型...避免了我这样情况。后来我知道了 TypeScript 也可以。慢慢喜欢上他。对代码有着严格要求,提前 debug ,最近准备好好学,在忙都要学,可方便了。...我老是问我同事,你们 java 里面是不是有那个语法 implements 和 extends , 还请教了她们在 java 它们区别。

7.3K31

TypeScript 演化史 -- 7】映射类型和更好字面量类型推断

冻结对象后,就不能添加、更改或删除其中属性。...和 y 两属性 Point 接口,咱们定义了另一接口FrozenPoint,它与 Point 相同,只是它所有属性都被使用 readonly 定义为只读属性。...虽然上面的示例可以正确地编译和工作,但它有两大缺点 需要两接口。除了 Point 类型之外,还必须定义 FrozenPoint 类型,这样才能将 readonly 修饰符添加到两属性。...对于希望在应用程序冻结每种类型对象,咱们就必须定义一包装器函数,该函数接受该类型对象并返回冻结类型对象。没有映射类型,咱们就不能以通用方式静态地使用 Object.freeze()。...咱们可以更新任意多个属性,这使得setState方法成为 Partial 很好用例。 Lodash:pick 函数从一对象中选择一组属性

2.8K10

Typescript配合React实践

比如说对于组件间设置默认值,ts对于支持就是不太好。 后来由于一需求我改变了一点我想法,当时想法就是:“你别说,这个ts还有点用”。...// default state const userList: IUser = []const defaultState = { list: userList, total: 0,} 上面这种就不能通过一单纯数组就推断出...list类型是IUser数组类型,所以要添加无谓一 userList定义。...这个时候我们可是使用泛型,把类型传递进来(也可以说是通过typescript类型推断来推断出来)。...例:一组件要给一子(子...)传递一对象参数,但是现在可以想象到这个组件只用name字段,为了可扩展,不要只是给这个子(子...)只是传递name属性,要把整个对象传递过去。

92320

一文学懂 TypeScript 类型

--strictPropertyInitialization:如果属性不能是 undefined ,那么它必须在构造函数中进行初始化。...TypeScript 通常可以对它类型进行推断。例如如果你写下这行代码: 1let x = 123; 然后 TypeScript推断出 x 静态类型是 number。...TypeScript 知道 String 类型,因此可以推断出 func 类型。...对象 与Arrays类似,对象在 JavaScript 扮演两角色(偶尔混合和/或更加动态): 记录:在开发时已知固定数量属性。每个属性可以有不同类型。...字典:在开发时名称未知任意数量属性。所有属性键(字符串和/或符号)都具有相同类型,属性值也是如此。 我们将在本文章忽略 object-as-dictionaries。

2K41

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

规范方便,又不容易出错,对于 VS Code,它能做最多只是标示出有没有这个属性,但并不能精确表明这个属性是什么类型,但 TS 可以通过类型推导/反推导(说白话:如果您未明确编写类型,则将使用类型推断来推断您正在使用类型...,但对属性没有要求,建议使用 object {} 和 Object 表示范围太大,建议尽量不要使用 5)object of params // 我们通常在业务可多采用点状对象函数(规定参数对象类型..."10003", // 但类型 "Record" 需要该属性,所以我们还可以通过Record来做全面性检查 keyof 关键字可以用来获取一对象类型所有...Typescript 允许像对象属性值一样使用类型 type User = { userId: string friendList: { fristName: string...something; } 2)非断言符 TypeScript 还具有一种特殊语法,用于从类型删除 null 和 undefined 不进行任何显式检查。

2K30

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

规范方便,又不容易出错,对于 VS Code,它能做最多只是标示出有没有这个属性,但并不能精确表明这个属性是什么类型,但 TS 可以通过类型推导/反推导(说白话:如果您未明确编写类型,则将使用类型推断来推断您正在使用类型...,但对属性没有要求,建议使用 object {} 和 Object 表示范围太大,建议尽量不要使用 5)object of params // 我们通常在业务可多采用点状对象函数(规定参数对象类型..."10003", // 但类型 "Record" 需要该属性,所以我们还可以通过Record来做全面性检查 keyof 关键字可以用来获取一对象类型所有...Typescript 允许像对象属性值一样使用类型 type User = { userId: string friendList: { fristName: string...something; } 2)非断言符 TypeScript 还具有一种特殊语法,用于从类型删除 null 和 undefined 不进行任何显式检查。

2.7K10

TypeScript 官方手册翻译计划【二】:普通类型

对象类型 除了原始类型之外,最常见类型就是对象类型了。它指的是任意包含属性 JavaScript 值。要定义一对象类型,只需要简单地列举它属性和类型即可。...可选属性 对象类型也可以指定某些或者全部属性是可选。你只需要在对应属性名后面添加 ? 即可: function printName(obj: { first: string; last?...当 TypeScript 能够基于代码结构推断出更具体类型时,就会发生收窄。...boolean 类型本身其实就是联合类型 true | false 别名。 字面量推断 当你初始化一变量为某个对象时候,TypeScript 会假定该对象属性稍后可能会发生变化。...枚举 枚举是 TypeScript 添加到 JavaScript 一项特性。它允许描述一值,该值可以是一组可能命名常量

2.2K20

TypeScript 演化史 — 第二章】基于控制流类型分析 和 只读属性

TypeScript 2.0 之前,编译器无法推断出上面的语义。...为了清晰可见,我将 undefined 类型添加到 lastName 属性联合类型,尽管这是多余做法。...在严格 null 检查模式下,undefined 类型会自动添加到可选属性联合类型,因此我们不必显式将其写出。 明确赋值分析 基于控制流另一新特性是明确赋值分析。...其思想是确保每个不可局部变量在使用之前都已正确初始化。 只读属性TypeScript 2.0 ,readonly 修饰符被添加到语言中。...也就是说,它是类型系统另一特性,通过让编译器从 TypeScript 代码库检查意外属性分配,帮助你编写正确代码。

2K10

typescript 接口_typeScript

第三步:添加约束,id属性只能是只读,sex属性为可选属性 要将一属性设置为只读很简单,只需要在属性前面增加关键字readonly,设置属性为可选属性也很简单,只需在属性后面添加符号?...,首先我们在浏览器查看是否打印了这个对象 由于id是只读,我们测试修改id是否报错 很明显,这里报错了,说id是只读属性 又由于sex是可选属性,所以我们不设置sex,看看是否成功...做为变量使用的话用 const,若做为属性则使用 readonly。 函数类型 接口能够描述JavaScript对象拥有的各种各样外形。...如果你不想指定类型,TypeScript类型系统会推断出参数类型,因为函数直接赋值给了 SearchFunc类型变量。 函数返回值类型是通过其返回值推断出(此例是 false和true)。...,TypeScript 也能够用它来明确强制一类去符合某种契约。

1.1K20

什么是鸭子🦆类型?

我们不用关心鸭子定义是什么,只要符合我们通常意义上认知,那么他就是这个物体。在 TypeScript ,只要对象符合定义类型约束,那么我们就可以视为他是。...相比之下,在 JavaScript ,try-catch 则存在很多限制 — 你既不能根据抛出异常原型定义不同 catch 块,也不能确定抛出到底是不是异常实例。...我们做了下面几个判断: 检查参数 value 是不是 检查参数 value 是否为 object 类型 通过 Reflect.get 方法更安全安全地判断 quack 是不是函数 你可能对这种代码再熟悉不过了...但是,解析器可能没我们想象那么聪明,这里会报错,因为他还是不能确定 value 到底是只鸭子还是只猫,所以无法确定 quack 函数是不是存在。...小技巧 - 通用类型保护 上面的判断可能在我们代码很常见用法,如果我们需要判断类型有很多,为每个类型都实现一这样类型保护函数挺麻烦,所以我们可以稍微做个变形来封装一更通用类型保护函数

2K20

《现代Typescript高级教程》高级类型

通过映射类型,我们可以对已有类型属性进行转换、修改或添加属性。这在许多情况下都非常有用,例如将属性变为只读或可选,从现有属性中选择一部分属性等。...下面是一些常见映射类型示例: 1. Readonly Readonly 是 TypeScript 内置映射类型,它将给定类型所有属性变为只读。...Record Record 是一映射类型,它根据指定键类型和值类型创建一对象类型。...infer关键字作用是告诉 TypeScript 编译器在条件类型推断一待定类型,并将其赋值给声明类型变量。这使得我们可以在条件类型中使用这个推断出类型进行进一步类型操作。...infer关键字是 TypeScript 中用于提取并推断待定类型工具。它允许我们在条件类型声明一类型变量,用于在类型推断过程捕获和使用待推断类型,从而使类型系统更加灵活和强大。

19730

编写高效 TS 代码一些建议

TypeScript 是一种由微软开发自由和开源编程语言。它是 JavaScript 超集,而且本质上向这个语言添加了可选静态类型和基于类面向对象编程。...假设你需要写一函数,用于从一对象数组抽取某个属性值并保存到数组,在 Underscore 库,这个操作被称为 “pluck”。...要从对象上获取某个属性值,你需要保证参数 key 是对象属性。..., y: 4}; // OK 虽然这是构建这样一简单对象一种迂回方式,但对于向对象添加属性并允许 TypeScript 推断新类型来说,这可能是一种有用技术。...要以类型安全方式有条件地添加属性,可以使用带 null 或 {} 对象展开运算符,它不会添加任何属性: declare var hasMiddle: boolean; const firstLast

3.1K61

TypeScript 超详细入门讲解

,那我们就不能使用它来创建对象了 const aaa = new Animal('sss') // 报错 我们可以在抽象类添加抽象方法,没有方法体 // 定义抽象方法 abstract sayHello...接口 接口时用来定义一类结构,用来定义一应该包含哪些属性和方法 它和 type 有一点相似互通之处 我们可以采用 type 来描述一对象类型 type myType = { name...myInterface { sex: string } 这样就以 2 接口合并起来为准 接口可以用来在定义类时候用来限制类结构 接口中所有属性不能有实际值,接口只定义对象结构,而不考虑实际值...属性封装 现在属性是在对象设置属性可以任意被修改,这样会 导致对象数据变得非常不安全 我们可以在属性添加属性修饰符 public 修饰属性可以在任意位置访问 private 定义为私有属性...,私有属性只能在类内部访问 通过类添加方法使得私有属性可以被外部访问 protected 受包含属性,只能在当前类和当前类子类访问 // 定义私有变量 private name: String

66110

TypeScript 超详细入门讲解

,那我们就不能使用它来创建对象了 const aaa = new Animal('sss') // 报错 我们可以在抽象类添加抽象方法,没有方法体 // 定义抽象方法 abstract sayHello...接口 接口时用来定义一类结构,用来定义一应该包含哪些属性和方法 它和 type 有一点相似互通之处 我们可以采用 type 来描述一对象类型 type myType = { name...myInterface { sex: string } 这样就以 2 接口合并起来为准 接口可以用来在定义类时候用来限制类结构 接口中所有属性不能有实际值,接口只定义对象结构,而不考虑实际值...属性封装 现在属性是在对象设置属性可以任意被修改,这样会 导致对象数据变得非常不安全 我们可以在属性添加属性修饰符 public 修饰属性可以在任意位置访问 private 定义为私有属性...,私有属性只能在类内部访问 通过类添加方法使得私有属性可以被外部访问 protected 受包含属性,只能在当前类和当前类子类访问 // 定义私有变量 private name: String

70510
领券