Sui.

帖子

分享您的知识。

Owen.
Owen1466
May 31, 2025
专家问答

在 Sui Move 的 coin:: Coin 中使用自定义结构作为类型参数时出现类型检查错误?

问题:

我在 Sui Move 代码中遇到了一个我不明白的类型检查错误. 这是我的代码的简化版本:

module my_module::mymodule {
    use sui::coin;
    use sui::wallets;

    struct MyCoin has drop {}

    public fun create_coin(): coin::Coin<MyCoin> {
        coin::mint(1000)
    }
}

当我尝试编译时,出现以下错误:

Invalid type parameter instantiation.
Expected type 'phantom type T' but found 'MyCoin'

我做错了什么?为什么我不能用MyCoin作类型参数coin::Coin,我该如何解决这个类型检查问题?

  • Sui
  • Architecture
4
4
分享
评论
.

答案

4
HaGiang.
Jun 1 2025, 03:20

你遇到这种类型检查错误是因为 coin:: Coin 期望 T 是幻影类型——这意味着它仅在类型级别使用,从不存储在实际数据结构中. 在您的原始代码中,您将 MyCoin 定义为没有任何类型参数或幻象用法的普通结构. 这打破了对硬币模块的期望.

Sui中的硬币模块是通用的,其中硬币类型只是一个标记,就像一个用于区分硬币和另一种硬币的标签. 这就是为什么它期望该类型不携带实际数据,仅用于打字目的.

4
评论
.
harry phan.
May 31 2025, 09:45

你在未正确注册自定义硬币类型 myCoin 的情况下尝试使用硬币:: mint (1000). 在 Sui Move 中,在铸造自定义硬币之前,你需要使用 create_currency 函数对其进行定义和注册.

https://docs.sui.io/references/framework/sui/coin

1
评论
.
MoonBags.
Jul 23 2025, 16:08

你遇到这个错误是因为 sui:: coin:: Coin 要求 T 是幻像类型,而你的 myCoin 结构没有这样标记. 要使用您的自定义 myCoin 作为 coin:: Coin 的类型,您的结构必须:

module my_module::mymodule {
    use sui::coin;

    struct MyCoin has drop, store {} // add `store` because it's often required
    phantom struct PhantomMyCoin has drop, store {}

    public fun create_coin(): coin::Coin<PhantomMyCoin> {
        coin::mint<PhantomMyCoin>(1000)
    }
}
1
评论
.
0xduckmove.
Jul 23 2025, 16:09

你正在尝试使用自定义 myCoin 作为 coin:: Coin 的类型参数,但是 Move 会抛出:

Invalid type parameter instantiation. Expected type 'phantom type T' but found 'MyCoin'

简而言之,这意味着:coin:: Coin 旨在仅接受声明为幻影的类型. 你试图传入一个常规结构,编译器说:“不,我无法安全地保证它在内存中是如何使用的.

所以,除非你的类型是这样声明的:

phantom struct MyCoin has store, drop {}

... 它不能与硬币:: Coin一起使用.

-1
评论
.

你知道答案吗?

请登录并分享。

Sui is a Layer 1 protocol blockchain designed as the first internet-scale programmable blockchain platform.

610帖子1335答案
Sui.X.Peera.

赚取你的 1000 Sui 份额

获取声誉积分,并因帮助 Sui 社区成长而获得奖励。

奖励活动七月