首页 > 解决方案 > 当我指定类型时,打字稿显示“任何”

问题描述

让我们产生一个情境。有一个简单的抽象类定义棋盘游戏中的棋子,如国际象棋或跳棋。

export abstract class Piece<Tags, Move, Position = Vector2> {
  public constructor(public position: Position, public tags = null) {}
  public abstract getMoves(board: Board<Tags, Move, Position>): Move[]
}

Board也是一个抽象类。

export abstract class Board<Tags, Move, Position = Vector2> {
  public constructor(
    public size: Position,
    public pieces: Piece<Tags, Move, Position>[]
  ) {}
}

当我尝试扩展此类时,Typescript 说boardgetMoves方法中是any.

class Checker extends Piece<Tags, Move> {
  getMoves(board /*← any */) {
    return []
  }
}

但为什么?我对泛型或抽象类有误解吗?

标签: typescripttypescript-generics

解决方案


您必须声明一个与抽象类具有相同签名的方法,以证明您已经履行了抽象类的契约。

class Checker extends Piece<Tags, Move> {
  public getMoves(board: Board<Tags, Move, Position>): Move[]{
    return []
  }
}

之后,您将能够创建一个const piece:Piece = new Checker()并能够依赖对 piece.getMoves(board) 的调用的键入。

这个例子展示了基本模式(省略了你没有提供实现的类型)......

在此处输入图像描述


推荐阅读