我有一个具有属性的类,该属性可以由开发人员进行扩展,但是我无法使用打字稿推断(或使开发人员能够指定)更具体的类型。在这个例子中,我有一个属性" 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
答案 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) );