ค้นหาเว็บไซต์

ramda.js - Ramda และ Typescript: เพิ่ม typings ที่ขาดหายไป


ฉันใช้ TypeScript และ Ramdajs ในโปรเจกต์ปัจจุบันของฉัน และฉันเพิ่งสังเกตว่ามีบาง typing ที่หายไป เช่น ไม่มี typing สำหรับฟังก์ชัน innerJoin (เวอร์ชัน @types/ramda คือ 0.25.36 ซึ่งฉันเดาว่าล่าสุดในตอนนี้) ฉันได้ลองเพิ่มคำจำกัดความแบบกำหนดเองในไฟล์แยกภายในโปรเจกต์:

declare namespace R {
    interface Static {
        innerJoin(): any;
    }
}

และแม้ว่า:

declare let R: R.Static;

declare namespace R {
    interface Static {
        innerJoin(): any; /* here should be a specific signature */
    }
}

export = R;
export as namespace R;

แต่ไม่สำเร็จ - typescript ทำเครื่องหมาย R.innerJoin(/*...*/) เป็นไม่ทราบ:

คุณสมบัติ 'innerJoin' ไม่มีอยู่ในประเภท 'Static'

มีใครรู้วิธีการใช้งานมันอย่างถูกต้องไหม? ผมหาวิธีแก้ปัญหาแบบชั่วคราวเจอแล้ว: const R_innerJoin=(R as any).innerJoin แต่ผมสงสัยว่าควรจะมีวิธีที่สวยงามกว่านี้โดยใช้ '.d.ts' ...

ป.ล. เวอร์ชันของ Ramda คือ 0.25.0 ถ้าว่าสิ่งนี้สำคัญ

อัปเดต

ฉันกำลังใช้ Ramda ด้วยวิธีนี้:

import * as R from 'ramda';
const myFn = (a, b) => R.innerJoin(// etc

คำตอบ #1

เนื่องจากคุณกําลังนําเข้าเนมสเปซ R จากโมดูล คุณต้องเพิ่มโมดูลเดิม หากคุณประกาศเนมสเปซ R ของคุณเอง คุณจะเห็นเนมสเปซของคุณหรือเนมสเปซที่นําเข้า ไม่ใช่การควบรวมกิจการ ต่อไปนี้ใช้ได้ผลสําหรับฉันหลังจากลองผิดลองถูกเล็กน้อย:

declare module "dummy" {
    module "ramda" {
        interface Static {
            innerJoin(): any;
        }
    }
}

การประกาศโมดูลภายนอกเป็นสิ่งจำเป็นเพื่อให้การประกาศโมดูลภายในเป็น "การเสริม" แทนที่จะบังโมดูลต้นฉบับ ดังที่กล่าวถึงในกระทู้นี้ เทคนิคนี้น่าเสียดายที่เท่าที่ทราบยังไม่มีเอกสารอธิบายอย่างถูกต้อง

บทความที่เกี่ยวข้อง