typescript 汇编脚本编译错误:TS2329:类型中缺少索引签名

qojgxg4l  于 2023-02-13  发布在  TypeScript
关注(0)|答案(1)|浏览(132)

我尝试在AssemblyScript中创建排序函数,但在函数中收到此错误。我希望排序函数可重用,并接受两个可能的排序参数。我正在传入具有索引签名的类,但收到此错误。
我读过其他几个问题,但都没能帮我解决这个问题:

此外,在他们的Github中发现了这一点:https://github.com/AssemblyScript/assemblyscript/issues/1972
完整代码:https://pastebin.com/gXY5PxVn
代码总结:

export function processPlayers ( allPlayerData: Array<PlayerData> ): Array<PlayerData> {
    let players = sortPlayersByField(allPlayerData);
    ...
};

const sortPlayersByField = function(
    players: Array<PlayerData>,
    field: String = 'fantasy_points',
    secondaryField: String = ''
): Array<PlayerData>{
    const sortFunc = function(
        a: PlayerData,
        b: PlayerData
    ): i32{
        // --- Handle when the field isn't set or has no value
        if(!a[field] && !b[field]){
            return 0;
        }
        if(!a[field]){
            return 1;
        }
        if(!b[field]){
            return -1;
        }
        ...
    }
    players.sort(sortFunc)
    return players;
}

/**
 * Definition for all data for a player that gets returned by the query to get
 * all players in a league for the draft board
 */
class PlayerData {
    [key: String]: any // --- Index signature IS present
    player_id: number
    ...
}

错误总结:

ERROR TS2329: Index signature is missing in type 'assembly/index/PlayerData'.
    :
 40 │ if(!a[field] && !b[field]){
    │     ~
    └─ in assembly/index.ts(40,13)

ERROR TS2329: Index signature is missing in type 'assembly/index/PlayerData'.
    :
 40 │ if(!a[field] && !b[field]){
    │                  ~
    └─ in assembly/index.ts(40,26)

ERROR TS2329: Index signature is missing in type 'assembly/index/PlayerData'.
    :
 43 │ if(!a[field]){
    │     ~
    └─ in assembly/index.ts(43,13)

ERROR TS2329: Index signature is missing in type 'assembly/index/PlayerData'.
    :
 46 │ if(!b[field]){
    │     ~
    └─ in assembly/index.ts(46,13)

我试过使用接口并将其分配给类,但结果是同样的错误。我试过使用类似于我看到的其他一些问题中的类型,但这在AssemblyScript中甚至不起作用。声明类型时无法编译。我已尝试更改"sortFunc"的签名不使用PlayerData类型,而是创建包含索引签名的泛型对象类型,这也会导致编译错误。不确定如何处理此问题。

############################

    • 第二个示例**

我在尝试解决这个问题时遇到了另一个例子,这个例子更清楚一些。
完整代码:https://pastebin.com/zKUCTLy4

class DraftBoard {
    leagueFillNumbers: LeagueFillNumbers
    constructor(
        mvpBoardTeams: Array<MvpBoardTeam>
    ){
        this.leagueFillNumbers = new LeagueFillNumbers(mvpBoardTeams);
    }
}

class LeagueFillNumbers {
    [key: i32]: TeamFillNumbers
    constructor(
        mvpBoardTeams: Array<MvpBoardTeam>
    ){
        for(let i = 0; i < mvpBoardTeams.length; i++){
            this[mvpBoardTeams[i].id] = new TeamFillNumbers();
        }
    }
}

class TeamFillNumbers {
    [key: string]: i32
    constructor(){
        const fantasyPositions: Array<string> = PositionHelper.getFantasyPositionList();
        for(let i = 0; i < fantasyPositions.length; i++){
            this[fantasyPositions[i]] = 0;
        }
    }
}

编译器错误为:

ERROR TS2329: Index signature is missing in type 'assembly/index/LeagueFillNumbers'.
     :
 194 │ this[mvpBoardTeams[i].id] = new TeamFillNumbers();
     │ ~~~~
     └─ in assembly/index.ts(194,13)

ERROR TS2329: Index signature is missing in type 'assembly/index/LeagueFillNumbers'.
     :
 180 │ return this.leagueFillNumbers[mvpBoardTeamId];
     │        ~~~~~~~~~~~~~~~~~~~~~~
     └─ in assembly/index.ts(180,16)

据我所知,我已经在所有这些示例中正确地声明了一个密钥签名。我不确定问题是什么。我可以看出,使用[]标记来设置对象的动态属性是问题的一部分,因为这是我在这里的两个示例中唯一触发它的东西。

o8x7eapl

o8x7eapl1#

这花了我一段时间,但我已经设法 * 几乎 * 解决它。
其中一个问题似乎是类需要重载"[]"操作符才能使语法a[field]起作用,经过反复试验,这似乎起作用了:

@operator("[]")
foo(k: string): i32 {
  if (k == "player_id")                     {return this.player_id;}
  else if (k == "hasStats")                 {return this.hasStats;}
  else if (k == "rank")                     {return this.rank;}
  ...

遗憾的是,我不能让它使用泛型类型,所以我只使用数字,我将number改为i32
在此之后,另一个大问题是AssemblyScript目前不支持闭包,这是自定义排序函数所发生的情况。因此,为了看看我是否能解决这个问题,我重构了代码,使该函数是独立的。
但是因为Array.sort()方法只能接受2个对象,并且因为在不创建闭包的情况下不能以这种方式传递字段,所以必须以老式的方式对它进行排序。我重新使用了RosettaCode中的quickSort类型脚本代码,传递了两个额外的参数(fieldsecondaryField),现在它似乎可以工作了。
剩下的唯一问题是我无法让泛型为那个运算符重载工作,但也许比我聪明的人也能解决这个问题。
代码是here,它并不完整,因为我使用了javascript中的console.log函数,并且没有包含quickSort的实现,但是思想是存在的。

相关问题