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

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.9K10

    Typescript配合React实践

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

    94120

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

    2.3K20

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

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

    2.3K20

    【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 超详细入门讲解

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

    74210

    TypeScript 超详细入门讲解

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

    72410

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

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

    21730

    编写高效 TS 代码的一些建议

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

    3.2K61
    领券