2013-03-10 2 views
1

J'ai besoin d'utiliser node-java node_module dans mon projet de typographie.node-java tapuscrit import

Cependant,

var java = require("java"); 

ne fonctionne pas de manière dactylographiée, et aussi

import java = module("java"); 

ne fonctionne pas comme il est.

Je sais que nous pouvons avoir besoin d'un fichier de définition, etc., et il y a un projet comme https://github.com/borisyankov/DefinitelyTyped

Cela dit, je pense qu'il est trop compliqué de le faire par moi-même.

Y a-t-il une solution de contournement plus facile? Merci.

+0

Qu'est-ce que vous utilisez comme chargeur de module? ExigeJS? – thomaux

+0

@Anzeo node.js a un chargeur de module intégré. – Fenton

+1

@SteveFenton Doh! :) – thomaux

Répondre

2

La meilleure façon est d'utiliser un fichier de définition pour node-java API, cependant, en utilisant votre premier extrait de code:

var java = require("java"); 

vous pouvez utiliser une référence à this node typing comme suit:

/// <reference path="node/node.d.ts" /> 

var java = require("java"); 

java.classpath.push("commons-lang3-3.1.jar"); 
java.classpath.push("commons-io.jar"); 

var list = java.newInstanceSync("java.util.ArrayList"); 

java.newInstance("java.util.ArrayList", function(err, list) { 
    list.addSync("item1"); 
    list.addSync("item2"); 
}); 

var ArrayList = java.import('java.util.ArrayList'); 
var list2 = new ArrayList(); 
list.addSync('item1'); 

Pour utiliser le deuxième extrait:

import java = module("java"); 

vous aurez besoin d'un fichier de définition. Pour un coup de pied, vous pouvez commencer à créer un fichier node-java.d.ts avec le code suivant:

module "java" { 
    export var classpath: { push(jar: string); }; 
    export function newInstanceSync(type: string); 
    export function newInstance(type: string, callback: (err, list) => any); 
    export function import(type: string); 
    export function newArray(...item: any[]); 
    export function callStaticMethodSync(...args: any[]); 
} 

Et utiliser ce fichier comme suit:

/// <reference path="node-java.d.ts" /> 

import java = module("java"); 

java.classpath.push("commons-lang3-3.1.jar"); 
java.classpath.push("commons-io.jar"); 

var list = java.newInstanceSync("java.util.ArrayList"); 

java.newInstance("java.util.ArrayList", function(err, list) { 
    list.addSync("item1"); 
    list.addSync("item2"); 
}); 

var ArrayList = java.import('java.util.ArrayList'); 
var list2 = new ArrayList(); 
list.addSync('item1'); 

Avoir du temps, je vais envoyer une définition node-java-DefinitelyTyped référentiel.

+1

Diullei, merci pour ce didacticiel très utile. Je vais mettre en œuvre votre suggestion. Apprécié. –

1

Quand vous dites que cela ne fonctionne pas:

var java = require("java"); 

Je suppose que vous obtenez une erreur d'appeler directement require parce qu'il ne disposait pas d'informations de type.

Une façon de résoudre ce problème est d'ajouter des informations de type pour redemanderas

declare var require: (module: string) => any; 
var java = require('java'); 

Ceci est un exemple simpliste - java ne sera pas typée comme la valeur de retour de require dans mon exemple est any - mais si vous vous aviez des informations de type pourriez lancer ce:

declare var require: (module: string) => any; 
var java = <JavaDefinition> require('java'); 
+1

Merci, Steve. En fait, votre suggestion pour la méthode -declare/require est celle que je cherchais, et très instructive. –