Polkadot.js部署合约编译报错:ISubmittableResult无contract属性
解决Next.js中Polkadot.js合约部署build时的类型错误
问题根源
yarn dev正常但yarn build报错,是因为开发模式下TypeScript严格类型检查未触发,而生产构建会启用严格校验。ISubmittableResult类型本身并不包含contract属性,直接解构会触发类型错误。
正确解决方案
不要直接从ISubmittableResult中取contract,而是从交易事件中提取合约地址,这是Polkadot.js官方推荐的标准方式:
示例代码
import { ApiPromise } from '@polkadot/api'; // 假设已初始化ApiPromise实例api,以及部署交易tx tx.signAndSend(account, (result) => { // 仅在交易进入区块或最终确认时处理 if (result.status.isInBlock || result.status.isFinalized) { // 查找合约实例化事件 const instantiatedEvent = result.events.find( ({ event }) => api.events.contracts.Instantiated.is(event) ); if (instantiatedEvent) { // 从事件数据中解析合约地址 const [, contractAddress] = instantiatedEvent.event.data; console.log('部署的合约地址:', contractAddress.toString()); // 这里写入你的后续业务逻辑 } } });
额外注意事项
- 版本适配:不同Polkadot.js版本的事件名称可能略有差异,若
Instantiated事件不存在,可检查对应版本的api.events.contracts下的事件列表。 - 提前发现类型问题:修改
tsconfig.json,将strict设为true,这样开发模式下也能触发类型检查,避免等到build才暴露问题:{ "compilerOptions": { "strict": true } }
内容的提问来源于stack exchange,提问作者s.Takahashi
相关产品推荐
相关产品推荐

