Переписать / расширить выражения классов машинописи - PullRequest
0 голосов
/ 14 ноября 2018

Моя компания разработала собственную тестовую среду для программного обеспечения, потому что невозможно использовать среду с открытым исходным кодом в контексте разрабатываемого нами программного обеспечения.

В любом случае, я написал Файлы определения Typescript, чтобы улучшить завершение кода для VS Code, но я не могу заставить его работать для следующей настройки:

Следующий класс используется для определения модульных тестов. Он обеспечивает некоторые функции, например, для утверждений. Основная проблема - это пространство имен утилит. Вы можете пройти функцию, которая на самом деле является модульным тестом. Обратите внимание, что объект this этой функции указывает на класс модульного теста, поэтому переданная функция может использовать функции модульного теста (внутренне переданная функция будет вызываться с помощью "unitTest.call (this)") для установки этот объект функции для экземпляра модульного теста)

class UnitTest {
    constructor(unitTest: (this: UnitTest) => void);
    .
    .
    .
    util = Util; // Referes to the Util-Class (it's a class because its the only possibility in typescript for nesting 

Util-класс предоставляет некоторые общие функции, которые полезны для написания тестов

class Util {
    static createFile(filePath: string): File;
    .
    .
    .
}

Если вы объявляете юнит-тест таким образом, все работает нормально:

var unitTest = new UnitTest(function() {
     this.util.createFile("..."); // VS-Code provides code completion for that functions of the unit-test-namespace
});

Проблема в том, что класс утилит (который используется для инкапсуляция кода) может быть расширена в каждом проекте. Вы можете определить сценарий, следуя определенной схеме имени, и тестовая структура динамически загружает этот сценарий и предоставляет эти функции в пространстве имен util, например, "Test.util.myProject.js"

module.exports = {
    myCustomUtilFunction = function () { ... }
};

Просто предоставив скрипт, вы можете использовать эту функцию в своем модульном тесте:

var unitTest = new UnitTest(function() {
 this.util.myCustomUtilFunction();
});

Но я не могу охватить это файлом определения машинописи. VS-Code не обеспечит никакого дополнения кода для пользовательских утилит, потому что оно отсутствует в определении машинописного текста тестовой среды. Я попытался расширить класс Util следующим образом, но VS-Code это не волнует:

class Util {
    static myCustomUtilFunction(): void;
}

Есть идеи, как это решить?


Чтобы было легче понять, вот полная настройка
testframework.d.ts

class UnitTest {
    constructor(unitTest: (this: UnitTest) => 

    util = Util;
}

class Util {
    static createFile(filePath: string): File;
}

myExtendedUtilNamespace.d.ts

class Util {
    static myCustomUtilFunction(): void;
}

unitTests.js

var unitTest = new UnitTest(function() {
    this.util.createFile("..."); // works
    this.util.myCustomUtilFunction(); // does not work
});

1 Ответ

0 голосов
/ 14 ноября 2018

Для меня это звучит так, как будто класс Util никогда не создается. Если это правильно, это не должен быть класс. A namespace является более подходящим в этом контексте. Пространства имен также можно объединять между файлами объявлений.

// testframework.d.ts
class UnitTest {
    constructor(unitTest: (this: UnitTest) => void);

    util = Util;
}

declare namespace Util {
    export function createFile(filePath: string): File;
}

// myExtendedUtilNamespace.d.ts
declare namespace Util {
  export function myCustomUtilFunction(): void;
}

См. Руководство по TypeScript о пространствах имен: https://www.typescriptlang.org/docs/handbook/namespaces.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...