typescript - relativ import kan inte lösas till en ambient modul
Enligt TypeScript-dokumentationen (https://www.typescriptlang.org/docs/handbook/module-resolution.html):
En relativ import löses i förhållande till den importerande filen och kan inte lösas till en ambient modulkod.
men också:
Till exempel skulle en import-sats som import { b } från "./moduleB" i /root/src/moduleA.ts resultera i att följande platser försöks för att hitta "./moduleB":
/root/src/moduleB.ts
/root/src/moduleB.tsx
/root/src/moduleB.d.ts
/root/src/moduleB/package.json (if it specifies a "typings" property)
/root/src/moduleB/index.ts
/root/src/moduleB/index.tsx
/root/src/moduleB/index.d.ts"
Raden /root/src/moduleB.d.ts verkar för mig vara en ambient moduldeklaration som används för att lösa den relativa importen "./moduleB" -> precis det som dokumentationen förnekar att den gör.
Missar jag något här eller är dokumentationen fel?
Svar #1
Kort svar
Raden /root/src/moduleB.d.ts verkar för mig som en ambient moduldeklaration... Missar jag något här eller är dokumentationen fel?
Du missar något här. moduleB.d.ts är inte en ambient moduldeklaration. Här är ett exempel på en fil som innehåller en ambient moduldeklaration av moduleB.
// someFile.d.ts
declare module "moduleB" {
export class b { }
}
Nyckelordet declare anger en omgivande deklaration.
Vissa detaljer
Om ordet ambient säger dokumentationen:
Vi kallar deklarationer som inte definierar en implementation för "ambient". Vanligtvis definieras dessa i .d.ts-filer.
Ambienta deklarationer inkluderar men är inte begränsade till ambienta moduldeklarationer. En .d.ts-fil som innehåller ambianta deklarationer är inte en ambient moduldeklaration och innehåller inte nödvändigtvis en ambient moduldeklaration.
Till exempel innehåller följande greeter.d.ts-fil en ambient klassdeklaration, men det är inte en ambient moduldeklaration.
// greeter.d.ts
declare class Greeter {
constructor(greeting: string);
greeting: string;
}
Filen foobar.d.ts innehåller följande två ambienta moduldeklarationer av "foo" och "bar", men filen själv är inte en ambient moduldeklaration.
// foobar.d.ts
declare module "foo" {
export function doFoo(foo: string): string;
}
declare module "bar" {
export function doBar(bar: string): string;
}
Dokumentationen som du ursprungligen citerade anger att en relativ import av "./foo" inte kunde lösas till ovanstående omgivande deklaration av den modulen.
Ytterligare detaljer
Se: https://www.typescriptlang.org/docs/handbook/modules.html
Se även: https://github.com/Microsoft/TypeScript-Handbook/issues/180
Se även: https://www.typescriptlang.org/docs/handbook/declaration-files/by-example.html
