当前位置: 首页 > 知识库问答 >
问题:

typescript - 如何在TypeScript中处理对象并添加新的字段?

宰父存
2023-12-04

现有一个a对象和b对象,a对象为服务器返回的数据,b对象为对a对象加工后的数据。

类型为:

interface C {  a: string  b: string  c: string}type A = Omit<C, 'c'>type B = C

由于A数据并没有c字段, 我要加c字段,但是加c字段又提示A没有c字段,如:

a.c = 'abc' // 报错类型A上不存在属性cb = a

还是说我直接把类型定义为:

interface C {  a: string  b: string  c?: string}type A = Ctype B = C

共有2个答案

公冶嘉
2023-12-04

假如服务端响应的数据类型如下:

interface User {    id: number    username: string}

现在前端需要为每个User添加一个默认头像,则前端实际使用的数据类型如下:

interface User {    id: number    username: string    avatar: string}

你的问题是,想在响应的数据中添加avatar属性,这在 typescript 中是不可能的,编译不通过。

解决这个问题的前提是需要知道 typescript 本质上仍然是 javascript,你在 javascript 中可以很随意地为一个对象添加属性,即便它在定义或初始化时并不存在这个属性。那换个角度想一下,如果你在 javascript 中获取一个对象上不存在的属性时会是什么结果?

let o = {id: 1, username: "user"}console.log(o.avatar) // undefined

undefined

这就是 typescript 的接口中属性的?的用途。

interface User {    id: number    username: string    avatar?: string}

?即代表avatar可能存在,也可能不存在,这样的话,你就可以给avatar赋值了:

const response: User = {id: 1, username: 'user'}response.avatar = 'https://example.com/avatar.png'// 如果你不给 avatar 赋值,则 response.avatar 也是 undefined,这一点与 javascript 是一致的。

到这里基本上就已经解决了你的问题,但是,如果你希望在使用时不希望编辑器老是提示avatar可能是undefined,那就是另一个问题了。

韦志新
2023-12-04

一个方式就是问题中所展示的, 但是不太灵活, 可以使用接口的任意属性:

interface Person {    name: string;    age?: number;    [propName: string]: any;}let tom: Person = {    name: 'Tom',    gender: 'male'};

使用 [propName: string] 定义了任意属性取 string 类型的值。

需要注意的是,一旦定义了任意属性,那么确定属性和可选属性的类型都必须是它的类型的子集:

interface Person {    name: string;    age?: number;    [propName: string]: string;}let tom: Person = {    name: 'Tom',    age: 25,    gender: 'male'};// index.ts(3,5): error TS2411: Property 'age' of type 'number' is not assignable to string index type 'string'.// index.ts(7,5): error TS2322: Type '{ [x: string]: string | number; name: string; age: number; gender: string; }' is not assignable to type 'Person'.//   Index signatures are incompatible.//     Type 'string | number' is not assignable to type 'string'.//       Type 'number' is not assignable to type 'string'.
http://ts.xcatliu.com/basics/type-of-object-interfaces.html
 类似资料:
  • 问题内容: 例如,我正在尝试导出TS对象以获取以下JavaScript输出: 这是我的TS,但导出尚不明确, 我已经尝试过了,但是它的生成的输出是不期望的。我究竟做错了什么? 问题答案: 在ES6中,允许使用导出功能导出名称,或者默认情况下,您可以导出任何内容。该格式是这样的: 并且它将默认导出配置文件。对于您的情况,您应该执行以下操作: 如果要使用导出,请执行以下操作: 区别是: 至 注意-默认

  • 主要内容:TypeScript,JavaScript,TypeScript 类型模板,TypeScript,JavaScript,TypeScript,JavaScript,鸭子类型(Duck Typing)对象是包含一组键值对的实例。 值可以是标量、函数、数组、对象等,如下实例: var object_name = { key1: "value1", // 标量 key2: "value", key3: function() { // 函数 }, key4:["content1", "cont

  • 我想给一个对象里所有值为null的属性赋其它值,比如: 有没有大佬知道 assignDefaults 这个函数如何实现?

  • 主要内容:创建 Map,实例 - test.ts 文件,实例 - test.js 文件,实例 -test.ts 文件,实例Map 对象保存键值对,并且能够记住键的原始插入顺序。 任何值(对象或者原始值) 都可以作为一个键或一个值。 Map 是 ES6 中引入的一种新的数据结构,可以参考 ES6 Map 与 Set。 创建 Map TypeScript 使用 Map 类型和 new 关键字来创建 Map: 初始化 Map,可以以数组的格式来传入键值对: Map 相关的函数与属性: map.clea