typescript 问题 求救
发布于 5 年前 作者 ganshiqingyuan 4699 次浏览 来自 问答

先贴代码

const testDto:Array<{dd:Array<{ddd:string}>}> = [{dd:[await Promise.resolve({ddd:'123',asd:456})]}]
const testDto2:Array<{dd:Array<{ddd:string}>}> = [{dd:[{ddd:'123',asd:456}]}]

TIM图片20191206103757.png 两个测试dto 类型相同,为什么被promise 包裹后的 对象新增属性ts不会提示多属性,,没被包裹的会提示,,

但是如果缺少属性两者都会提示缺少,很怪,,,

 const testDto:Array<{dd:Array<{ddd:string}>}> = [{dd:[await Promise.resolve({ddd3:'123',asd:456})]}]
 const testDto2:Array<{dd:Array<{ddd:string}>}> = [{dd:[{ddd:'123',asd:456}]}]

TIM图片20191206104510.png

求救,,, 我想做的是,nest 中定义好返回数据类型dto 定好之后在构造返回数据时,如果多数据少数据都会被提示,,然而用了promise后,,多数据不提示了,,很难受。。。

更新问题,写个简化版

const testDto:{dd:string} = {dd:'123',ss:123}
const testDto2:{dd:string} = await Promise.resolve({dd:'123',ss:123})
const testDto3:Promise<{dd:string}> = Promise.resolve({dd:'123',ss:123})

TIM图片20191206104510.png

5 回复

不奇怪,本来就是这样的。因为 Promiseinterface

定义变量并且初始化的时候,所有的属性都需要匹配,多了也不行,少了也不行。

const testDto: { dd: string } = { dd: "123", ss: 123 };
// error TS2322: Type '{ dd: string; ss: number; }' is not assignable to type '{ dd: string; }'.
// Object literal may only specify known properties, and 'ss' does not exist in type '{ dd: string; }'.

const testDto: { dd: string, ss: number } = { dd: "123" };
// error TS2741: Property 'ss' is missing in type '{ dd: string; }' but required in type '{ dd: string; ss: number; }'.

但是当赋值时,多的可以赋值给少的,反之则不行。

let testDto1 = { dd: "123", ss: 123 };
let testDto2 = { dd: "123" };

testDto1 = testDto2  // 错误
testDto2 = testDto1  // 正确

错误提示:

error TS2741: Property ‘ss’ is missing in type ‘{ dd: string; }’ but required in type ‘{ dd: string; ss: number; }’.

const testDto:{dd:string} = {dd:'123',ss:123} 是变量初始化 const testDto2:{dd:string} = await Promise.resolve({dd:'123',ss:123}) 是变量定义和赋值

const testDto:{dd:string} = {dd:'123',ss:123} 报错。你试一下:

const tmp = { dd: "123", ss: 123 };
const testDto: { dd: string } = tmp;

@justjavac const testDto:{dd:string} = (function(){return {dd:'123',dd2:'456'}})()

这样也报错,

@justjavac 跟promise 没什么关系,好像是和你说的初始化和赋值的区别有关系

回到顶部