Typescript泛型约束不起作用
嗨,伙计们,我有这个问题 我正在创建一个只想与约束一起使用的服务 为此,我有一个接口Typescript泛型约束不起作用,typescript,Typescript,嗨,伙计们,我有这个问题 我正在创建一个只想与约束一起使用的服务 为此,我有一个接口 abstract class Base { } class ModelFromBase extends Base { } interface IService<T extends Base> { doSomething(model: T); } class ModelNotFromBase { } class Services<ModelNotFromBase>
abstract class Base {
}
class ModelFromBase extends Base {
}
interface IService<T extends Base> {
doSomething(model: T);
}
class ModelNotFromBase {
}
class Services<ModelNotFromBase> implements IService<ModelNotFromBase> {
doSomething(model: T) {}
}
抽象类基类{
}
类ModelFromBase扩展了Base{
}
接口{
剂量测定法(型号:T);
}
以及这个实现接口的类
abstract class Base {
}
class ModelFromBase extends Base {
}
interface IService<T extends Base> {
doSomething(model: T);
}
class ModelNotFromBase {
}
class Services<ModelNotFromBase> implements IService<ModelNotFromBase> {
doSomething(model: T) {}
}
类ModelNotFromBase{
}
类服务实现IService{
剂量测定法(模型:T){}
}
问题是ModelNotFromBase不扩展Base(顾名思义),TS编译器也不会对此大惊小怪
当我创建IService实例时也是如此
private _instance: IService<ModelNotFromBase>;
private\u实例:iSeries;
同样的问题,我的意思是我可以在那里提供任何东西
那么这里的问题是什么,
正如文档所示,您可以使用约束
有什么我遗漏的吗?或者我的方法不正确吗?根据
Base
和ModelNotFromBase
的定义,这可能是预期的行为。确定类型兼容性时,typescript使用结构兼容性。这意味着这两个类彼此完全兼容:
class Base {
name: string;
}
class ModelNotFromBase {
name: string;
}
var b : Base = new ModelNotFromBase(); // Works fine
如果类/接口Base
为空(class Base{}
),则约束不会真正约束任何内容,因为任何其他类型都可以分配此类型的变量
class Base { }
var d : Base = 0;
var d2: Base = "";
如果要避免结构类型,可以在Base
类上定义私有属性(不必使用它,只需存在它),然后约束只能由继承Base
的类满足:
class Base {
private nonstructural: true;
}
class ModelNotFromBase { }
interface ITemplatingService<T extends Base> {
doSomething(model: T);
}
export class Services<T extends Base> implements ITemplatingService<T> {
doSomething(model: T) { }
}
var _instance: ITemplatingService<ModelNotFromBase>; //error
export class OtherServices implements ITemplatingService<ModelNotFromBase> { // also error
doSomething(model: ModelNotFromBase) { }
}
类基{
私人非结构性:正确;
}
类ModelNotFromBase{}
接口项平台服务{
剂量测定法(型号:T);
}
导出类服务实现ITemplatingService{
剂量测定法(模型:T){}
}
var_实例:ITemplatingService//错误
导出类OtherServices实现ITemplatingService{//也有错误
doSomething(model:ModelNotFromBase){}
}
您的示例没有编译,ITemplatingService
是IService
ModelNotFromBase
用作服务的类型参数
,它也是一个类吗?您可以发布Base
和ModelNotFromBase
的代码吗?啊,对不起,我现在就解决这个问题。。是的,ITemplatingService就是iSeries。所以我有一个Base,它只是一个标记,接口应该只与扩展Base ex ModelFromBase的模型一起工作。。但正如你们所看到的,我有ModelNotFromBase,它可以used@MCR编辑了答案,我的意思是将非结构化的
字段设置为私有