Typescript 泛型类型错误TS2322:类型';{id:null;}';不可分配给类型';T';

Typescript 泛型类型错误TS2322:类型';{id:null;}';不可分配给类型';T';,typescript,Typescript,下面的代码出现TS类型检查错误 接口资源{ id:字符串; } 接口资源状态{ 资料:T; 哈希:字符串; } 抽象类资源组件{ 受保护状态:ResourceState={ 数据:{//类型检查 id:“” }, 散列:“” }; } //不适合我的用例 //抽象类资源组件{ //受保护状态:ResourceState={ //数据:{ //id:null // }, //散列:“” // }; // } 接口模型扩展了资源{ 名称:字符串; } 类ModelComponent扩展了

下面的代码出现TS类型检查错误

接口资源{
id:字符串;
}
接口资源状态{
资料:T;
哈希:字符串;
}
抽象类资源组件{
受保护状态:ResourceState={
数据:{//类型检查
id:“”
},
散列:“”
};
}
//不适合我的用例
//抽象类资源组件{
//受保护状态:ResourceState={
//数据:{
//id:null
//     },
//散列:“”
//   };
// }
接口模型扩展了资源{
名称:字符串;
}
类ModelComponent扩展了ResourceComponent{
构造函数(){
超级();
this.state.data.name='ModelComponent';//类型检查确定
this.state.data.age=20;//类型检查正常
console.log(this.state.data);
}
}
const component=new ModelComponent();
在第12行,我得到了错误TS2322:Type“{id:null;}”不可分配给Type“R”。TypeScript不应该理解,因为“R扩展了资源”,所以可以使用具有资源类型形状的值初始化数据

在第36、37行,TS正确执行类型检查


您需要告诉您的数据对象,您分配给它的实际上是R

abstract class ResourceComponent<R extends Resource> {
  protected state: ResourceState<R> = {
    data : { // Type checking KO
      id: "null"
    } as R,
    hash: ''
  };
}
抽象类资源组件{
受保护状态:ResourceState={
数据:{//类型检查
id:“空”
}作为R,
散列:“”
};
}

是否启用了
--structNullChecks
?如果这样做(建议这样做),则
null
不是字符串。这与null无关。为了清晰起见,我修改了代码片段,并添加了stackblitz。谢谢,行得通。但我想用TypeScript来推断。