Asked
2 years, 3 months ago
Viewed
4k times
Code is:
export class ExtendedMap<T, U> extends Map {
constructor() {
super();
}
toggle(key: T, value: U) {
if (this.has(key)) {
super.delete(key);
} else {
super.set(key, value);
}
}
has(key: T): boolean {
return super.has(key);
}
}
I get this error for ES5 compilation:
ERROR TypeError: Constructor Map requires ‘new’
I’m using it like this:
public registryLayers = new ExtendedMap<number, any>();
Snippet (without TypeScript parts commented out):
T.J. Crowder
1.0m187 gold badges1909 silver badges1862 bronze badges
asked Mar 2, 2021 at 11:24
12
TypeScript should be complaining about Map
if you’re targeting ES5 (it does in this example).
If you ignore that error from TypeScript and then run the code that TypeScript generates in a modern(ish) JavaScript engine, the problem is that the code TypeScript created is trying to call Map
like an old-style constructor function. When you configure TypeScript to emit ES5 code, it doesn’t emit class
constructs because ES5 didn’t have them. Instead, it emits constructor function syntax, and in your ExtendedMap
constructor, it tries to call Map
like this:
return _super.call(this) || this; // Where `_super` is set to `Map`
But in a modern environment, Map
is defined as a class
constructor and cannot be called that way, resulting in the error you’re getting.
If you need your code to run in an ES5 environment, you need to include a Map
polyfill (since Map
didn’t exist in ES5) that is written to be compatible with an ES5 environment so that Map
can be called via .call
as above. And if your code is running in a modern(ish) environment that already has Map
, you’ll still need to include the polyfill because of the way it gets called.
answered Mar 2, 2021 at 11:46
T.J. CrowderT.J. Crowder
1.0m187 gold badges1909 silver badges1862 bronze badges
Hi all,
There’s a problem with the Map constructor that happens when the seq parameter contains multiple elements with the same key (but differing value). In .NET, this results in a Map containing the last seq value for a given key; in W#, this results in a Map containing the first seq value for a given key.
Repro:
let test() =
let listWithDupes=[("A",1);("B",2);("A",3)]
let m = Map listWithDupes
let i = m.Item("A")
// This is 3 on .NET, and 1 in W#.
i
Tested on 4.6.1.381.
#1
Отправлено 21 февраля 2022 — 23:10
-
- Местный
-
Помогите решить ошибку. Вообщем когда я хочу в этой программе создать обьект, у которого число больше 15000, то сразу вылазит данная ошибка. Допустим хочу создать обьект 19601, но вылазит эта ошибка и приходится закрыть прогу через диспетчер задач, что делать?
0
#2
Отправлено 22 февраля 2022 — 00:06
- Профессионал
-
Самп установлен?
Сообщение отредактировал Perdolinka: 22 февраля 2022 — 00:07
0
#3
Отправлено 22 февраля 2022 — 00:38
- Местный
-
Perdolinka (22 февраля 2022 — 00:06) писал:
кнш
0
#4
Отправлено 22 февраля 2022 — 01:20
- Профессионал
-
Помнится мне, что эта ошибка возникает лишь когда отсутствуют необходимые объекты. Раз уж самп у тебя установлен, логично предположить, что объекты от него присутствуют.
0
#5
Отправлено 22 февраля 2022 — 06:22
- ( ^_^ )
-
Возможно у вас старая версия Map Construction, попробуйте установить самую последнюю версию, скачать можно тут: https://pawn.wiki/in…p-construction/
0
#6
Отправлено 22 февраля 2022 — 14:28
- Местный
-
Romzes (22 февраля 2022 — 06:22) писал:
Не помогу, видимо баг в самом мапе конструкшин, попробуйте добавить через insert обьект 19601 и убедитесь, что это невозможно
0
#7
Отправлено 22 февраля 2022 — 16:22
- ( ^_^ )
-
FasminCode (22 февраля 2022 — 14:28) писал:
попробуйте добавить через insert обьект 19601 и убедитесь, что это невозможно
Все работает
0
#8
Отправлено 22 февраля 2022 — 16:26
- Знаток
-
Добавляй объекты сначала в раздел Objects (через кнопку Add), а потом из этого меню insert их
0
#9
Отправлено 22 февраля 2022 — 16:29
- Местный
-
FARADAY (22 февраля 2022 — 16:26) писал:
Добавляй объекты сначала в раздел Objects (через кнопку Add), а потом из этого меню insert их
Добавил, но он прозрачный и не работает…
https://sun9-51.userapi.com/impg/HsiccdNorrM9zHlWcYY399XXSq8lhE-RjyiWjA/LWZZBkMW4Ow.jpg?size=933×525&quality=96&sign=88f8876eafe3517e8f1e8a3bbb45c566&
type=album
0
#10
Отправлено 22 февраля 2022 — 16:43
- ( ^_^ )
-
Как выше писали, попробуй установить 0.3.7, возможно у тебя другая версия, или та что стоит она без необходимых файлов.
sa-mp-0.3.7-R4-install.exe
1
- ← Предыдущая тема
- Вопросы по скриптингу
- Следующая тема →
- Вы не можете создать новую тему
-
Тема закрыта
2 человек читают эту тему
0 пользователей, 2 гостей, 0 скрытых пользователей
Нам нужна любая программа для открытья .img — Например Crazy IMG editor(не реклама).
*Для сборки*
Открываем программу. Слева сверху есть кнопка *Open file* — что то типо такого
Переходим в корень игры. Например: E:GamesGTA Criminal Russiamodelsgta3.img
И кидаем туда 3д объект.(можно с заменой).
*Мод-пак*
Все так же только нужно создавать собственный IMG файл, его не создать в программе Crazy IMG editor(точно не помню где создать, можно взять готовый и удалить от туда файлы)
Теперь надо дать нашему объекту ID.
Переходим в корневую папку. Например: E:GamesGTA Criminal Russiadatamapscrteamcrteam.ide
Открываем с помощью блокнота и видим много текста.
Крутим в самый низ.
И пишим любой ID (желательно выше 15.000) и название объекта который вы хотите добавить.
Например:
Объяснение:
15000 — вами заданное ID объекта (сами придумаете)
obj — dff (название файла формата .dff) — Объект
obj — txd (название файла формата .txd) — Текстуры
299, 0 — за это не шарю, но по дефолту всегда желательно ставить это при добавлении.
Теперь 3д объект надо добавить на сервер.
Заходим в павно и открываем свой мод. (у всех по разному, но у меня LoadObject();
Как видно на скриншоте, у меня уже есть инклуд с маппингом, и мы можем просто перейти в него ->
Когда перешли можем добавлять строчку из map constructor.
Осталось приконнектить наш мод-пак к серверу, думаю с этим не у кого не сложностей не будет.
#javascript #typescript
Вопрос:
Код-это:
export class ExtendedMap<T, U> extends Map {
constructor() {
super();
}
toggle(key: T, value: U) {
if (this.has(key)) {
super.delete(key);
} else {
super.set(key, value);
}
}
has(key: T): boolean {
return super.has(key);
}
}
Я получаю эту ошибку при компиляции ES5:
ОШИБКА типа Ошибка: Карта конструктора требует «нового»
Я использую его вот так:
public registryLayers = new ExtendedMap<number, any>();
Фрагмент кода (без закомментированных частей машинописного текста):
/*export*/ class ExtendedMap/*<T, U>*/ extends Map {
constructor() {
super();
}
toggle(key/*: T*/, value/*: U*/) {
if (this.has(key)) {
super.delete(key);
} else {
super.set(key, value);
}
}
has(key/*: T*/)/*: boolean*/ {
return super.has(key);
}
}
/*public*/ registryLayers = new ExtendedMap/*<number, any>*/();
console.log("Worked without error");
Комментарии:
1. Я как раз собирался указать, что
Map
этого не было в ES5. Также обратите внимание, что в вашем коде нет смысла использовать конструктор илиhas
переопределение. Вы можете унаследовать и то, и другое, так как ни то, ни другое не создает ничего нового. Также, вероятно, было бы лучше использоватьthis
, а неsuper
toggle
использовать .2. Тогда вам понадобится полифилл, потому что в ES5 его не было
Map
.3. ФУ вот ссылка на игровую площадку
4. @Ти Джей Краудер вау! Я имею в виду — УУУУУУ. Я никогда не пользовался
Symbol.species before
. Я должен был следить за твоими ответами давным-давно5. @Ти Джей Краудер да, я знаю, я видел это в твоем блоге. Это, защищаясь, будет моей следующей книгой. На данный момент у меня есть еще два, которые я еще не закончил )). Мне нравится, что вы углубились в спецификацию JS
Ответ №1:
TypeScript должен жаловаться Map
, если вы нацелены на ES5 (в этом примере это так).
Если вы проигнорируете эту ошибку в TypeScript, а затем запустите код, который TypeScript генерирует в современном(иш) движке JavaScript, проблема в том, что созданный TypeScript код пытается вызвать Map
функцию конструктора старого стиля. Когда вы настраиваете TypeScript для создания кода ES5, он не создает class
конструкций, потому что в ES5 их не было. Вместо этого он выдает синтаксис функции конструктора, и в вашем ExtendedMap
конструкторе он пытается вызвать Map
следующее:
return _super.call(this) || this; // Where `_super` is set to `Map`
Но в современной среде Map
определяется как class
конструктор и не может быть вызван таким образом, что приводит к ошибке, которую вы получаете.
Если вам нужно, чтобы ваш код выполнялся в среде ES5, вам необходимо включить Map
заполнение (поскольку Map
в ES5 его не существовало), которое написано для совместимости со средой ES5, чтобы Map
его можно было вызывать, .call
как указано выше. И если ваш код выполняется в современной(иш) среде , которая уже существует Map
, вам все равно нужно будет включить заполнение из-за способа его вызова.