TypeScript - "לא ניתן לקרוא בשם" בעת יצירת הכרזות


נתקלתי בשגיאה מוזרה במצב די פשוט.

קובץ ThingA.ts

export class ThingA {

} 

קובץ ThingB.ts

export class ThingB {

}

קובץ Things.ts (שיחזור ייצוא)

export {ThingA} from "./ThingA";
export {ThingB} from "./ThingB";

קובץ Test.ts (משתמש במחלקות המיוצאות מחדש)

import * as things from "./Things";

export class Test {

    public method = (input: things.ThingA)  => {

    };

}

זה מה שאני משתמש בו כדי לקמפל: (גרסת TypeScript 1.8.10)

tsc Test.ts --declaration --outDir compiled

זוהי השגיאה שאני מקבל:

Test.ts(5,5): error TS4029: Public property 'method' of exported class has or is using name 'ThingA' from external module ".../ThingA" but cannot be named.

הבעיה היא ביצירת קובץ הצהרה עבור Test.ts. כל הקבצים מקומפלים ל-.js ולכל קובץ יש .d.ts שנוצר, למעט Test.ts בגלל השגיאות שלמעלה. אם --declaration מוסר מפקודת הקומפילציה, אין שגיאות.

כמה תצפיות:

1) השגיאה לא מופיעה בכל הפניה ל-things.ThingA. אם היא מופנית כפרמטר של מתודה כפי שבדוגמה המסופקת, או כערך מוחזר, השגיאה מופיעה. אם היא מופנית בגוף מתודה, אז אין שגיאות. אני מבין שזה בגלל שהפניות בגוף מתודה אפילו לא יוזכרו בקובץ .d.ts שנוצר, אך עדיין אינני מבין מדוע tsc לא יכול להסיק את סוג המחלקה בפועל מהפניה ל-things.ThingA.

2) אם אני משנה את הפקודת הייבוא ב-Test.ts לזה:

import {ThingA,ThingB} from "./Things";

(במקום import * as things) ובהמשך להשתמש ב-ThingA ישירות, אין שגיאות. זו לא ממש פתרון, למרות זאת, כי זה קצת מבטל את המטרה של ייצוא מחדש.

3) אם אני פשוט מסיר את export מ-export class Test { בקובץ Test.ts, אין שגיאות, אך קובץ Test.d.ts ריק. גם אם הוא לא היה ריק, זה עדיין לא היה פתרון כי זו מקרה מפושט של הקוד בפועל שבו המקביל ל-Test.ts משמש (מיובא) בקובץ אחר ולכן המחלקה Test חייבת להיות מיוצאת.

האם אני עושה משהו לא נכון כאן?

תשובה #1

חשדתי שזה באג ולכן פרסמתי בעיה ב-github של TypeScript, ובאמת זה כך.

https://github.com/Microsoft/TypeScript/issues/8612