接口 x 任何

Interfaces x any

在这种情况下使用 'any' 而不是接口有什么缺点吗?

首先使用 Item 的接口:

imports ...
export interface Item { name: string; }

@Component({
  selector: 'app-root',
  template: `
  my template
  `
})
export class AppComponent {
  private itemsCollection: AngularFirestoreCollection<Item>;
  items: Observable<Item[]>;
  constructor(private afs: AngularFirestore) {
    this.itemsCollection = afs.collection<Item>('items');
    this.items = this.itemsCollection.valueChanges();
  }
}

没有界面,有'any'

imports...

@Component({
  selector: 'app-root',
  template: `
     my template
  `
})
export class AppComponent {
  private itemsCollection: AngularFirestoreCollection<any>;
  items: Observable<Any[]>;
  constructor(private afs: AngularFirestore) {
    this.itemsCollection = afs.collection<any>('items');
    this.items = this.itemsCollection.valueChanges();
  }
}

谢谢

在这种情况下使用 any 是一种不好的做法。基本上,您将丢弃 TypeScript 最重要的部分之一 (which is type system) 及其优势(编译时类型检查)。除非必要,否则不要 这样做。

我建议仅在两种情况下使用 any

  • 当你真正处理不可预测类型的对象时。即便如此,您可能还是希望首先声明一个 interface 类型来声明一个合同(在运行时可能会或可能不会履行)。

  • 当您对 JavaScript 没有相应 @types/* npm 模块的库使用“ambient declarations”时。这真是不得已而为之。好消息,如今环境声明越来越少了。