【问题标题】:set type of any of javascript object property设置任何 javascript 对象属性的类型
【发布时间】:2018-05-31 16:35:50
【问题描述】:

我有以下 javascript 对象

 venue = {
    id: 0,
    name: '',
    venueimage_set: [
      {
        imageurl: '',
      },

    ]...

然后在我的代码中更改对象:

 this.venue.venueimage_set[+image] = this.venue.venueimage_set[+image].imageurl;

为了使图像查看器工作,我只需要图像的 url,而不是图像 url 所属的键。因此,我将键中的内容设置为键值,即图像 url。

然后我会听到这种声音。

ERROR in mainroot/venuepage/venuepage.component.ts(171,25): error TS2322: Type 'string' is not assignable to type '{ imageurl: string; }'. mainroot/venuepage/venuepage.component.ts(175,127): error TS2339: Property 'imageurl' does not exist on type 'string'.

我希望打字稿忽略打字,让我这样做。我会怎么做?

【问题讨论】:

  • 如果你在做一些非常奇怪的类型混合,你为什么还要使用打字稿? for a image viewer to work 可能会有一种更优雅的方式来确保类型安全。
  • @JonasW。因为我希望我的幻灯片插件能够工作,而且我使用的是打字稿,因为 Angular 使用打字稿,而且我讨厌 javascript。即使在 Java 中,如果我必须在这些奇怪的用例中使用我认为合适的类型,我也可以操作和转换类型
  • 在表达式后面加上as any
  • @JonasW。很可能是这样,但我不会让我的业务推迟,同时我会为如此琐碎的事情制定一个更优雅的解决方案。只是希望它工作并继续前进。
  • 编写不安全的代码可能“现在”可以工作,但它可能会在某个时候停止工作,然后你就会遇到麻烦。

标签: javascript angular typescript casting typescript-typings


【解决方案1】:

这是您尝试执行的类型安全版本:

function toVenue<T>({id, name, venueimage_set}: T) {
  return {
    id,
    name,
    venueImageSet: venueimage_set.map(el => el.imageurl)
  };
}

设置venue时可以使用:

const venue = toVenue({
    id: 0,
    name: '',
    venueimage_set: [{
       imageurl: '',
    }]
});

这里是不安全的版本(请不要这样做):

this.venue.venueimage_set[+image] = this.venue.venueimage_set[+image].imageurl as any;

【讨论】:

  • 我的代码中不接受任何内容。这很奇怪
猜你喜欢
  • 1970-01-01
  • 2013-04-11
  • 2012-02-03
  • 2019-03-24
  • 2013-04-09
  • 2011-08-17
  • 2015-03-14
  • 2019-07-20
  • 1970-01-01
相关资源
最近更新 更多