chess.js 的打字稿声明文件
Posted
技术标签:
【中文标题】chess.js 的打字稿声明文件【英文标题】:Typescript declaration file for chess.js 【发布时间】:2017-09-12 06:33:44 【问题描述】:我正在尝试使用 typescript 并致力于为 chess.js 库 https://github.com/jhlywa/chess.js 创建一个声明文件。看来我不知道如何制作一个。当我尝试使用 import 语句导入库时
import Chess from chess.js
它抱怨模块 chess.js 没有导出的成员。
这是我目前拥有的 index.d.ts 文件。
declare namespace ChessJSTypes
type ChessType = 'p' | 'n' | 'b' | 'r' | 'q' | 'k';
type ChessColor = 'b' | 'w';
interface MoveOptions
sloppy: boolean;
interface HistoryOptions
verbose: boolean;
interface MovesOptions
legal?: boolean;
square?: string;
verbose?: boolean;
interface PgnOptions
sloppy?: boolean;
max_width?: number;
newline_char?: string;
interface IFlags
NORMAL: string;
CAPTURE: string;
BIG_PAWN: string;
EP_CAPTURE: string;
PROMOTION: string;
KSIDE_CASTLE: string;
QSIDE_CASTLE: string;
interface Move
to: string;
from: string;
san?: string;
flags?: string;
piece?: string;
color?: string;
captured?: string;
promotion?: string;
interface ValidationObject
error: string;
valid: boolean;
error_number: number;
interface ChessPiece
type: ChessJSTypes.ChessType;
color: ChessJSTypes.ChessColor;
declare class Chess
readonly PAWN: string;
readonly KNIGHT: string;
readonly BISHOP: string;
readonly ROOK: string;
readonly QUEEN: string;
readonly KING: string;
readonly BLACK: string;
readonly WHITE: string;
readonly FLAGS: IFlags;
constructor(fen: string);
constructor();
board(): ChessPiece[][];
load(fen: string): boolean;
reset(): void;
moves(options?: MovesOptions): string[] | Move[];
in_check(): boolean;
in_checkmate(): boolean;
in_stalemate(): boolean;
in_draw(): boolean;
insufficient_material(): boolean;
in_threefold_repetition(): boolean;
game_over(): boolean;
validate_fen(fen: string): ValidationObject;
fen(): string;
pgn(option?: PgnOptions): string;
load_pgn(pgn: string, options?: PgnOptions): boolean;
header(args?: any): void;
header(): any;
ascii(): string;
turn(): string;
move(move: string | Move, options?: MoveOptions): Move;
undo(): Move;
clear(): void;
put(piece: ChessPiece, square: string): boolean;
get(square: string): ChessPiece;
remove(square: string): ChessPiece;
perft(depth: number): number;
square_color(square: string): string;
history(options: HistoryOptions): Move[];
history(): string[];
declare module 'chess.js'
var Chess: Chess;
export = Chess;
【问题讨论】:
可以在模块声明中直接导出Chess
吗? export var Chess: Chess
我不确定。我仍在学习所有这些是如何工作的,并且我遵循的一些示例对名称空间和接口进行了此操作。鉴于我采用了基于类的设计,我认为它也应该适用。你有什么建议?
您只是想导出类以供其他文件/模块使用,还是这是在其他地方定义的实际类的声明?
我正在尝试在 Angular 4 项目的描述中使用国际象棋库。与其仅仅将 var chess 声明为 any,我认为我还不如添加到 distinctlyTyped 列表中,以防其他人想在 Typescript 项目中使用该库。我一直在阅读一些教程并查看了一些声明文件,但现在我被卡住了。
【参考方案1】:
您可以做的一件事是声明模块并将所有内容移入其中,而不尝试在声明中导出任何内容:
import * as Chess from 'chess.js';
declare module 'chess.js'
class Chess
// ...
【讨论】:
谢谢。这应该在声明文件中完成吗? 是的,您应该在index.d.ts
中执行此操作。
谢谢。现在试试看:)
你先生太棒了。有效!!我现在的问题是它为什么有效?由于我对这一切都很陌生,您能否阐明您的建议的作用?谢谢
很高兴它成功了!它之所以有效,是因为chess.js
为 CommonJS 风格的需求环境(包括 TypeScript/ES6)导出了一个变量 Chess
,而“环境模块”(使用declare module
创建的模块)是“始终可见的”,例如不需要直接导出。它不是超级深入,但this is the documentation on ambient modules。以上是关于chess.js 的打字稿声明文件的主要内容,如果未能解决你的问题,请参考以下文章