Изменить: я переписал сообщение, чтобы лучше объяснить шаги, которые я предпринял, и проблемы, с которыми я столкнулся.
Я начал с простой страницы html/js. Я также использую xregexp
с CDN.
var reg = XRegExp("^lights:(?<option>on|off)$", "xgi");
var match = XRegExp.exec("lights:on", reg);
document.body.innerText = "Lights are: " + match["option"];
<!DOCTYPE html>
<html lang="en">
<head></head>
<body></body>
<script src="https://cdnjs.cloudflare.com/ajax/libs/xregexp/3.1.1/xregexp-all.js"></script>
<script src="app.js"></script>
</html>
Далее я хочу преобразовать файл js в машинописный текст. Так что я:
- переименовать
.js
в.ts
- добавлено
declare var XRegExp:any;
в начало файлаts
(описано здесь) - запустил
tsc --init
для создания файла tsconfig - побежал
tsc
Пока что Typescript компилируется нормально, и страница все еще работает.
Затем я хочу заменить declare var XRegExp:any
интерфейсом из поддерживаемого сообществом файла объявлений.
Я устанавливаю типизацию для xregexp
через typings install dt~xregexp -SG
(ссылка на файл d.ts< /а>)
Но я не могу получить доступ к интерфейсам, объявленным в файле .d.ts
, потому что в объявлении используются declare module 'xregexp'
и export =
.
Согласно документации Typescript по Модулям, export =
используется с import = require()
. Но это связано с загрузкой модуля, а это не то, чего я хочу.
Я попробовал предложение Пелле, но до сих пор не знаю, как с его помощью объявить переменную окружения.
declare var XRegExp:xregexp.OuterXRegExp; // <-- TS error: Module 'xregexp' has no exported member 'OuterXRegExp'
Я бы хотел знать:
- Объявление
d.ts
используетdeclare module "xregexp"
. Могу ли я ссылаться на любой из его внутренних интерфейсов/типов безimport
? - is it possible for me to create an additional
d.ts
to declare the ambient variable? (like whatdt~react-global
does) How do I do this, without modifying the downloadedd.ts
?- reason: I would rather not change the declaration file pulled via
typings
in case of future changes.
- reason: I would rather not change the declaration file pulled via
На данный момент я не занимаюсь разработкой Node и не хочу настраивать загрузчик модулей и/или браузеры/webpack.
Я просто хочу преобразовать уже работающий файл js в ts и хотел бы, чтобы Typescript знал об окружающей переменной XRegExp
, интерфейс которой указан в загруженном файле d.ts
. Могу ли я добиться этого без лишних церемоний?
[Редактировать]
Итак, я переписал файл объявления, используя jquery.d.ts
в качестве ориентира.
Кажется, это работает при загрузке через скрипт или импорт, но не отвечает на мой первоначальный вопрос.
interface TokenOpts {
scope ? : string;
trigger ? : () => boolean;
customFlags ? : string;
}
interface XRegExp {
(pattern: string, flags ? : string): RegExp;
(pattern: RegExp): RegExp;
addToken(regex: RegExp, handler: (matchArr: RegExpExecArray, scope: string) => string, options ? : TokenOpts): void;
build(pattern: string, subs: string[], flags ? : string): RegExp;
cache(pattern: string, flags ? : string): RegExp;
escape(str: string): string;
exec(str: string, regex: RegExp, pos ? : number, sticky ? : boolean): RegExpExecArray;
forEach(str: string, regex: RegExp, callback: (matchArr: RegExpExecArray, index: number, input: string, regexp: RegExp) => void): any;
globalize(regex: RegExp): RegExp;
install(options: string): void;
install(options: Object): void;
isInstalled(feature: string): boolean;
isRegExp(value: any): boolean;
match(str: string, regex: RegExp, scope: string): any;
match(str: string, regex: RegExp, scope: "one"): string;
match(str: string, regex: RegExp, scope: "all"): string[];
match(str: string, regex: RegExp): string[];
matchChain(str: string, chain: RegExp[]): string[];
matchChain(str: string, chain: {
regex: RegExp;
backref: string
}[]): string[];
matchChain(str: string, chain: {
regex: RegExp;
backref: number
}[]): string[];
matchRecursive(str: string, left: string, right: string, flags ? : string, options ? : Object): string[];
replace(str: string, search: string, replacement: string, scope ? : string): string;
replace(str: string, search: string, replacement: Function, scope ? : string): string;
replace(str: string, search: RegExp, replacement: string, scope ? : string): string;
replace(str: string, search: RegExp, replacement: Function, scope ? : string): string;
replaceEach(str: string, replacements: Array < RegExp | string > []): string;
split(str: string, separator: string, limit ? : number): string[];
split(str: string, separator: RegExp, limit ? : number): string[];
test(str: string, regex: RegExp, pos ? : number, sticky ? : boolean): boolean;
uninstall(options: Object): void;
uninstall(options: string): void;
union(patterns: string[], flags ? : string): RegExp;
version: string;
}
declare module "xregexp" {
export = XRegExp;
}
declare var XRegExp: XRegExp;