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编辑了答案,我的意思是将
非结构化的
字段设置为私有