现有一个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
假如服务端响应的数据类型如下:
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
,那就是另一个问题了。
一个方式就是问题中所展示的, 但是不太灵活, 可以使用接口的任意属性:
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
运算符“+”不能应用于类型“T”和“number”