Как создать файл объявления Typescript для пользовательского класса без требования/импорта/экспорта

Надеясь, что кто-то может помочь мне разобраться с файлами объявлений машинописного текста и как получить доступ к моим пользовательским классам.

Итак, давайте представим, что у меня есть собственный класс для отображения предупреждающего сообщения в качестве примера:

CustomAlert.ts:

/// <reference path="typings/CustomAlert.d.ts" />
module MdlCustomAlerts{    
    class CustomAlert{
        constructor(alertMessage:string, alertOptions:IAlertOptions){
            alert(message);
        }
    }
}

CustomAlert.d.ts

declare module MdlCustomAlerts{
    interface IAlertOptions{

    }

    class CustomAlert{
      constructor(alertMessage:string, alertOptions:IAlertOptions)
    }
}

app.ts

/// <reference path="typings/MyAlert.d.ts" />

var alert1 = new MdlCustomAlerts.CustomAlert("Hello World", {});

Прежде всего, я получаю сообщение об ошибке «дублирующийся идентификатор» в CustomAlert.ts, поскольку класс CustomAlert определен в определениях. Мне нужен способ доступа к моему CustomAlert с использованием определений без использования import/require (мы не используем require.js, поэтому это вызывает проблемы).

Я думаю, мне нужно сделать что-то вроде экспорта общедоступного идентификатора для класса (возможно, переименовав класс в определениях в customAlert, а затем экспортировав ссылку), но я не могу заставить его работать. Если кто-то может помочь мне найти решение, я был бы очень благодарен!

заранее спасибо


person sugarflux    schedule 10.03.2017    source источник


Ответы (1)


Вы можете ссылаться на машинописные файлы непосредственно из других машинописных файлов; вам не нужны определения типов для них.

Определения типов предназначены для ввода файлов javascript для использования в Typescript.

... и вы должны использовать модули (ES6/commonJS - не то, что сейчас называется пространствами имен). Если вы этого не сделаете, по мере того, как ваше приложение станет больше, вы столкнетесь с кошмарными проблемами упорядочения файлов TS для правильной компиляции.

CustomAlert.ts

export class CustomAlert{
  constructor(alertMessage:string, alertOptions:IAlertOptions){
    alert(message);
  }
}

app.ts

import {CustomAlert} from './CustomAlert'

var alert1 = new CustomAlert("Hello World", {});
person Bruno Grieder    schedule 10.03.2017
comment
Спасибо за ответ - я обычно использую модули, но намеревался попытаться упростить проблему. У меня сложилось впечатление, что определение типов обычно является хорошей идеей, независимо от источника кода. Я подумал, что лучше хранить интерфейсы снаружи и предоставлять сжатую версию библиотеки для использования во внешних библиотеках. - person sugarflux; 10.03.2017
comment
Использование модулей также вносит дополнительную сложность, которую в идеале я хотел бы решить. Например, в идеале мне бы хотелось (используя приведенный выше пример), чтобы new CustomAlert(Message, {}) был доступен напрямую, а не достигал его с помощью new MdlCustomAlertModule.CustomAlert(Message,{}); Я думал, что определение сделает это возможным...? - person sugarflux; 10.03.2017
comment
Если вы создаете библиотеку, то да, создание файлов определений имеет смысл, потому что вы будете поставлять js + файлы определений, чтобы вашу библиотеку можно было использовать из JS и TS. - person Bruno Grieder; 10.03.2017
comment
Извините за несколько комментариев, но использование файла определения также позволяет вам комментировать код и предоставлять дополнительную информацию для библиотеки, вместо того, чтобы делать это непосредственно в исходном коде машинописного текста. И обеспечивает более удобное место для ссылки на другие библиотеки, которые используются. - person sugarflux; 10.03.2017
comment
Это касается создания библиотеки (в настоящее время у нас есть около 30 различных библиотек, которые часто взаимодействуют друг с другом). В идеале я хотел бы также перенести их на частный сервер NuGet. Так что я надеюсь, что где-то там все еще есть ответ на мой вопрос! - person sugarflux; 10.03.2017
comment
Я считаю, что вы смешиваете модули и пространства имен. Я говорю об использовании модулей стиля ES6/commonJS. С другой стороны, пространства имен обычно не нужны или даже не являются плохой идеей. - person Bruno Grieder; 10.03.2017
comment
Я получаю ошибки при использовании команды импорта, так как мы не используем require.js (я думал, что они связаны, но, пожалуйста, скажите мне, если я ошибаюсь) - person sugarflux; 10.03.2017
comment
Вам нужно скомпилировать для целевой ES6 или commonJS. Babel — ваш друг, если вы хотите скомпилировать ES6 до ES5, webpack — еще один ваш друг для перехода от commonJS к ES5. - person Bruno Grieder; 10.03.2017
comment
Спасибо, Бруно, теперь я компилирую для commonJS. Я работаю в крупной и хорошо зарекомендовавшей себя среде C#/.Net, поэтому добавление новых инструментов — это длительный, а не специальный процесс. Ссылка на файл .ts и использование import {CustomAlert} from './MdlCustomAlerts'; Я получаю сообщение об ошибке "Не удается найти модуль "./MdlCustomAlerts" - person sugarflux; 10.03.2017
comment
MdlCustomAlerts.ts находится в том же каталоге, что и файлы импорта? Это должно работать прямо из коробки - person Bruno Grieder; 10.03.2017
comment
Нет, это в другом каталоге. Сначала я ссылаюсь на файл .ts, а затем пытаюсь импортировать. Импорт должен указывать на правильный каталог? Например, импортировать {CustomAlert} из '../../../anotherDir/CustomAlerts.ts'? - person sugarflux; 10.03.2017
comment
да, он должен указывать на относительный путь, содержащий файл - person Bruno Grieder; 10.03.2017