Я пытаюсь сделать код моего бота более управляемым и разместить несколько диалогов, которые принадлежат друг другу, в разных файлах.
Здесь есть старый аналогичный вопрос для javascript.
Но я изо всех сил пытаюсь сделать то же самое с Typescript. Вероятно, это более общий вопрос по Typescript, поскольку я новичок и все еще немного смущен различными возможностями импорта, но я не нашел общего решения, которое я мог бы применить к этому.
Я пробовал вот что:
//testdialog.ts
export default (bot) => {
bot.dialog("/Test", [
(session, args, next) => {
console.info("test".green);
session.send(`Test Dialog triggered`);
},
]).triggerAction({ matches: "test" });
}
а затем в app.ts импортируйте его примерно так: import testdialog = require("./testdialog")(bot);
Но похоже, что это кажется совершенно неправильным по сравнению с безымянным импортом с ботом в качестве параметра в JS, как этот require('./cars.js')(bot);





Ваш синтаксис неверен, не используйте require, выполните импорт следующим образом:
import * as testdialog from './testdialog';
А затем запустите своего бота, вот так: testdialog(bot);
Можете ли вы опубликовать полный код, который дает вам эту ошибку?
В ECMAScript совершенно незаконно вызывать объект пространства имен модуля. import * as ns всегда создает такой объект, что означает, что ns() приведет к ошибке. Он может действительно работать при определенном времени работы, а транспилеры работают, но не являются ни правильными, ни переносными. Ожидается ошибка, которую получает @solaire, поскольку этот код неверен.
Также использование require совершенно правильно, если вы используете модули AMD, CommonJS или UMD.
На мой взгляд, вы можете использовать builder.Library() для достижения ваших требований.
//testdialog.ts
import * as builder from 'botbuilder';
export const createLibrary = () => {
let lib = new builder.Library('test');
lib.dialog('test', (session) => {
session.send('this is test dialog');
}).triggerAction({
matches: /test/
});
return lib.clone();
}
//app.ts
import * as restify from 'restify';
import * as builder from 'botbuilder';
import * as testDialog from './testdialog';
let server = restify.createServer({});
server.listen(3978, function () {
console.info('%s listening to %s', server.name, server.url);
})
let connector = new builder.ChatConnector({});
server.post('/api/messages', connector.listen());
let bot = new builder.UniversalBot(connector);
bot.dialog('/', (session) => {
session.send('welcome');
})
bot.library(testDialog.createLibrary())
Спасибо, это отлично работает! Это должно быть в документации по фреймворку бота imo.
Если вы напишете
// a.js
export default expression;
тогда ты должен написать
// b.js
import whatever from "./a";
console.info(whatever);
или же
// b.js
import * as whatever from "./a";
console.info(whatever.default);
или же
// b.js
import whatever = require("./a");
console.info(whatever.default);
Но если писать
// a.js
export = expression;
тогда ты должен написать
// b.js
import whatever = require("./a");
console.info(whatever);
Спасибо за примеры, очень помогает мне в понимании.
@solaire рад помочь
Если я попробую это сделать, я получаю сообщение об ошибке «Невозможно вызвать выражение, тип которого не имеет сигнатуры вызова». в testdialog (бот);