Búsqueda de sitios web

javascript - Fusión de espacios de nombres de TypeScript a través de archivos


Estoy teniendo algunos problemas para que un espacio de nombres se reconozca y compile correctamente a través de archivos. Según la documentación y esta respuesta de SO, lo siguiente no debería producir ningún problema:

App.Core.ts

namespace App.Core {
    export function createElem(tagName: string): JQuery {
        return $(document.createElement(tagName));
    }
}

App.Core.SubModule.ts

/// <reference path="App.Core.ts" />
namespace App.Core.SubModule {
    export function Test(): JQuery {
        return App.Core.createElem("div");
}

Sin embargo, Visual Studio me está dando un error en la llamada a la función en App.Core.SubModule.Test indicando Property 'createElem' does not exist on type 'typeof Core'. Mi entendimiento es que si un namespace está distribuido en múltiples archivos, el compilador de TS resolverá automáticamente esos namespaces. Parece que el JavaScript correspondiente se está generando correctamente; sin embargo, la falta de intellisense (y la línea de error roja ondulada) es excepcionalmente frustrante y me hace dudar de lo que estoy escribiendo.

¿Es esto un problema con la configuración de mi archivo, con el compilador de TS, o con las funcionalidades aparentemente rotas de IntelliSense de TypeScript en Visual Studio 2015 en este momento?

Respuesta #1

Visual Studio me está dando un error en la llamada a la función en App.Core.SubModule.Test indicando que la propiedad 'createElem' no existe en el tipo 'typeof Core'

Sospecha que tienes un import o export a nivel raíz en cualquiera de los archivos. Eso convierte el archivo en un módulo y lo desconecta del espacio de nombres global.

Solución rápida

Elimina esa importación/exportación, pero ten en cuenta que puede causar más problemas https://basarat.gitbook.io/typescript/main-1/outfile

Reparación adecuada

No uses namespace. Solo usa módulos: https://basarat.gitbook.io/typescript/project/modules/external-modules

Respuesta #2

Archivo A

namespace A {
  export type User = {
    name: string,
    age: number
  }
}

Archivo B

namespace A {
  export type Goods = {
    city: string,
    price: number
  }
}

Archivo C - fusionar espacios de nombres aquí

declare module 'Final' {
  import 'namespace-b';
  import 'namespace-a';
}

Archivo index.ts

import './namespace-final;';

function multipleNamespaces() {
  let user: A.User | A.Goods | undefined;
  user = { name: '', age: 0 }; // valid
  user = {city: 'beijing', price: 100} // vlaid
  user = 'test' // invalid
}

Artículos relacionados