如何使打字稿推断出更具体的类属性?

时间:2018-05-23 17:00:20

标签: typescript

我有一个具有属性的类,该属性可以由开发人员进行扩展,但是我无法使用打字稿推断(或使开发人员能够指定)更具体的类型。在这个例子中,我有一个属性" models"在我的应用程序类上应该与类型"模型"兼容。在我的情况下,它将被开发人员100%的时间覆盖更多特定类型(几乎),并且一旦设置就不会被修改 - 并且将在消费之前设置。

我如何帮助打字稿了解更具体的类型 - 或允许开发人员覆盖该类型?请记住,这适用于更多属性,这使得使用" const app = new App({config,models,stats,state})指定类型不方便;"

// External modules/types
interface Model {
  id: number;
}
interface UserModel extends Model {
  name: string;
}
interface Models {
  [service: string]: Model;
}
class Application {
  public models: Models = {};
}

// My app
const app = new Application();
app.models = {
  User: {
    id: 1,
      name: 'Kent',
  } as UserModel,
};

// app.models does not have .User

2 个答案:

答案 0 :(得分:1)

只有当存在可以推断的泛型类型参数时,Typescript才会进行类型推断(您想要发生的类型)。另外,要实现它,通常应该有一个带泛型参数的函数,然后可以从传递给函数的特定类型的实际参数推断出它的类型。

在您的情况下,您可以将Application类设为泛型,并将models作为参数传递给构造函数。在这种情况下,甚至没有必要为Models提供显式接口 - 约束是在Application泛型类声明中内联指定的:

// External modules/types
interface Model {
  id: number;
}
interface UserModel extends Model {
  name: string;
}

class Application<ServiceNames extends string, 
              Models extends { [service in ServiceNames]: Model }> {
  constructor(models: Models) {
    this.models = models;
  }
  public models: Models;
}

// My app
const app = new Application( {
  User: {
    id: 1,
      name: 'Kent',
  } as UserModel,
});

let n = app.models.User.name; // inferred as string

答案 1 :(得分:0)

使用generics

var myErrorList = vendorErrorList.Select( e => new Error(e) );