真的需要吗?

时间:2018-08-05 07:11:24

标签: angular typescript angular6

这是我使用教程创建的班级。我发现interface的名称是as。真的需要吗?该事件已被分配的目的是什么。

我的ts:

import { Component, OnInit } from '@angular/core'
import { ICurrentWeather } from '../interfaces'

@Component({
  selector: 'app-current-weather',
  templateUrl: './current-weather.component.html',
  styleUrls: ['./current-weather.component.css'],
})
export class CurrentWeatherComponent implements OnInit {

  current: ICurrentWeather /*already assigned*/

  constructor() {
    this.current = {
      city: 'Bethesda',
      country: 'US',
      date: new Date(),
      image: 'assets/img/sunny.png',
      temperature: 72,
      description: 'sunny',
    } as ICurrentWeather /*is it required again?*/
  }

  ngOnInit() {}
}

对Icon天气的诽谤:

export interface ICurrentWeather {
  city: string
  country: string
  date: Date
  image: string
  temperature: number
  description: string
}

3 个答案:

答案 0 :(得分:1)

不是,不是必需的,只是告诉编译器您比它更了解类型,并且它不应该再猜测您了。在您的代码中

current: ICurrentWeather

在这里,您声明一个类型为current的变量

this.current = {
      city: 'Bethesda',
      country: 'US',
      date: new Date(),
      image: 'assets/img/sunny.png',
      temperature: 72,
      description: 'sunny',
    } as ICurrentWeather

在这里,您正在将对象投射为其他类型,即{           城市:“贝塞斯达”,           国家:“美国”,           日期:new Date(),           图片:“ assets / img / sunny.png”,           温度:72,           描述:“晴天”,         }与current变量类型相同,然后将其分配给current

检查打字稿类型断言HERE

答案 1 :(得分:0)

在您的情况下,您已经为对象'current'的所有属性分配了值,因此,无论是否使用'as ICurrentWeather',它都没有任何区别。

如果您不想为任何属性分配值,则需要“ as ICurrentWeather”类型转换,否则代码将无法编译。

让我们认为“描述”属性不是必需的。

this.current = {
    city: 'Bethesda',
    country: 'US',
    date: new Date(),
    image: 'assets/img/sunny.png',
    temperature: 72
} as ICurrentWeather;

将起作用,但是

this.current = {
    city: 'Bethesda',
    country: 'US',
    date: new Date(),
    image: 'assets/img/sunny.png',
    temperature: 72
};

将无法编译。请注意,对象中没有'description'属性。

如果您想使'description'属性为空,则可以将接口声明为

export interface ICurrentWeather {
    city: string;
    country: string;
    date: Date;
    image: string;
    temperature: number;
    description?: string;
}

请注意,“ description”属性已附加“?” 现在,下面的代码也将起作用,因为该对象的所有必需属性都分配了值。

this.current = {
    city: 'Bethesda',
    country: 'US',
    date: new Date(),
    image: 'assets/img/sunny.png',
    temperature: 72
};

答案 2 :(得分:0)

简短的回答是否定的。 在这种情况下,用作类型转换。 在这种情况下,它不是必需的,因为您要提供接口的所有参数。 如果您没有提供,则需要使用“ as”将其强制转换为您的类型。  范例- 您的界面

export interface ICurrentWeather {
  city: string
  country: string
  date: Date
  image: string
  temperature: number
  description: string
}

您并没有提供所有值,可以将其转换为ICurrentWeather类型

current: ICurrentWeather
this.current = {} as ICurrentWeather