Node.js 无法在结构协定api中使用接口

Node.js 无法在结构协定api中使用接口,node.js,typescript,hyperledger-fabric,hyperledger,Node.js,Typescript,Hyperledger Fabric,Hyperledger,我正在尝试使用IBM Visual Studio代码区块链平台插件和Fabric contract apiv1.4.2为Hyperledger Fabric 1.4开发链代码。在这种情况下,在尝试使用链码方法中的接口时,我会遇到一些问题。这就是错误: 错误:没有为参数myAssetConfig正确指定类型,无法处理纯对象类型 我正在使用的资产称为MyAsset。这是该元素的声明: @Object() 出口类资产{ @财产() 公共财产a:字符串; @财产() 公共属性b:字符串; @财产() 公

我正在尝试使用IBM Visual Studio代码区块链平台插件和Fabric contract apiv1.4.2为Hyperledger Fabric 1.4开发链代码。在这种情况下,在尝试使用链码方法中的接口时,我会遇到一些问题。这就是错误:

错误:没有为参数myAssetConfig正确指定类型,无法处理纯对象类型

我正在使用的资产称为
MyAsset
。这是该元素的声明:

@Object()
出口类资产{
@财产()
公共财产a:字符串;
@财产()
公共属性b:字符串;
@财产()
公共属性c?:字符串;
构造函数(myAssetConfig:IMyAssetConfig){
this.propertyA=myAssetConfig.propertyA;
this.propertyB=myAssetConfig.propertyB;
if(myAssetConfig.hasOwnProperty('propertyC')){
this.propertyC=myAssetConfig.propertyC;
}
}
}
除此之外,这是
types/index.d.ts
的内容(我在这里使用标志
@Object
,但我不确定是否应该以及为什么/为什么不):

@对象
导出接口IMyAssetConfig{
属性a:字符串;
属性b:字符串;
propertyC?:字符串;
}
导出类型MyAssetId=string;
最后,这是myasset contract.ts的内容

@Info({title:'MyAssetContract',description:'My MyAsset Contract'})
导出类MyAssetContract扩展了合同{
@交易(假)
@返回('boolean')
公共异步myAssetExists(ctx:Context,myAssetId:myAssetId):承诺{
const buffer=await ctx.stub.getState(myAssetId);
返回(!!buffer&&buffer.length>0);
}
@交易()
公共异步createMyAsset(ctx:Context,myAssetConfig:IMyAssetConfig):承诺{
常量myAssetId:myAssetId=myAssetConfig.shippingCompanyId+'-'+this.GenerateInternMyAsetId(ctx);
const exists=等待此消息。myAssetExists(ctx,myAssetId);
如果(存在){
抛出新错误(`myAsset${myAssetId}已存在`);
}
const myAsset=新的myAsset(myAssetConfig);
const buffer=buffer.from(JSON.stringify(myAsset));
等待ctx.stub.putState(myAssetId,缓冲区);
返回myAssetId;
}
@交易(假)
@返回(“我的资产”)
公共异步readMyAsset(ctx:Context,myAssetId:myAssetId):承诺{
const exists=等待此消息。myAssetExists(ctx,myAssetId);
如果(!存在){
抛出新错误(`myAsset${myAssetId}不存在`);
}
const buffer=await ctx.stub.getState(myAssetId);
返回JSON.parse(buffer.toString())作为MyAsset;
}
@交易()
公共异步拆分MyAsset(ctx:Context,myAssetId:myAssetId,children:IMyAssetConfig[]):Promise{
//删除,因为它实际上与问题无关,并且使文章过长。
返回[];
}
}
当然,这一切都是匿名的,但我认为问题已经很清楚了。我不能使用
IMyAssetConfig
作为参数
myAssetConfig
的输入,但如果使用
字符串
,则没有问题。直到有一天我才明白,
fabric-contract-api
不接受对象作为参数。但是,如果我对
createMyAsset
的所有代码进行注释,我不会得到任何错误,而且我还在
splitMyAsset
中使用一个对象,我在那里没有问题

有人能解释一下这是怎么回事吗?当我尝试使用
npm test
实例化链式代码/运行测试时,就会出现问题


非常感谢。

我想如果唯一的解决方案是使用字符串,我将使用字符串化JSON。然而,我很奇怪地看到不允许使用对象。似乎我通过从资产的每个属性中删除标记@Property解决了这个问题。我不知道这是否有意义。