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 的打字稿声明文件的主要内容,如果未能解决你的问题,请参考以下文章

使用声明文件打字稿

合并/检索打字稿声明文件

库的打字稿声明文件找不到模块

使用别名而不是相对路径创建的打字稿声明文件

如何在打字稿中声明全局变量

无法重新声明块范围变量(打字稿)