我尝试在AssemblyScript中创建排序函数,但在函数中收到此错误。我希望排序函数可重用,并接受两个可能的排序参数。我正在传入具有索引签名的类,但收到此错误。
我读过其他几个问题,但都没能帮我解决这个问题:
- How to fix "Index signature is missing in type" error?
- Typescript: index signature is missing in type when extending interface
- How to declare one type for all class methods in typescript
- Can I define a Typescript class which has an index signature?
此外,在他们的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)
据我所知,我已经在所有这些示例中正确地声明了一个密钥签名。我不确定问题是什么。我可以看出,使用[]标记来设置对象的动态属性是问题的一部分,因为这是我在这里的两个示例中唯一触发它的东西。
1条答案
按热度按时间o8x7eapl1#
这花了我一段时间,但我已经设法 * 几乎 * 解决它。
其中一个问题似乎是类需要重载
"[]"
操作符才能使语法a[field]
起作用,经过反复试验,这似乎起作用了:遗憾的是,我不能让它使用泛型类型,所以我只使用数字,我将
number
改为i32
。在此之后,另一个大问题是AssemblyScript目前不支持闭包,这是自定义排序函数所发生的情况。因此,为了看看我是否能解决这个问题,我重构了代码,使该函数是独立的。
但是因为
Array.sort()
方法只能接受2个对象,并且因为在不创建闭包的情况下不能以这种方式传递字段,所以必须以老式的方式对它进行排序。我重新使用了RosettaCode中的quickSort
类型脚本代码,传递了两个额外的参数(field
和secondaryField
),现在它似乎可以工作了。剩下的唯一问题是我无法让泛型为那个运算符重载工作,但也许比我聪明的人也能解决这个问题。
代码是here,它并不完整,因为我使用了javascript中的
console.log
函数,并且没有包含quickSort
的实现,但是思想是存在的。