Map constructor ошибка

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's user avatar

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. Crowder's user avatar

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* — что то типо такого         
image.png

Переходим в корень игры. Например: E:GamesGTA Criminal Russiamodelsgta3.img
И кидаем туда 3д объект.(можно с заменой).

*Мод-пак*
Все так же только нужно создавать собственный IMG файл, его не создать в программе Crazy IMG editor(точно не помню где создать, можно взять готовый и удалить от туда файлы)

Теперь надо дать нашему объекту ID.
Переходим в корневую папку. Например: E:GamesGTA Criminal Russiadatamapscrteamcrteam.ide

image.pngОткрываем с помощью блокнота и видим много текста.

Крутим в самый низ.
И пишим любой ID (желательно выше 15.000) и название объекта который вы хотите добавить.
Например:

image.png

Объяснение: 
15000 — вами заданное ID объекта (сами придумаете)
obj — dff (название файла формата .dff) — Объект
obj — txd (название файла формата .txd) — Текстуры
299, 0 — за это не шарю, но по дефолту всегда желательно ставить это при добавлении.

Теперь 3д объект надо добавить на сервер.
Заходим в павно и открываем свой мод. (у всех по разному, но у меня LoadObject();

image.png

Как видно на скриншоте, у меня уже есть инклуд с маппингом, и мы можем просто перейти в него -&gt;image.png

Когда перешли можем добавлять строчку из 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 , вам все равно нужно будет включить заполнение из-за способа его вызова.

Понравилась статья? Поделить с друзьями:
  • Map construction ошибка dxt2
  • Map construction samp ошибка
  • Manufacturer control ошибка
  • Manual method unavailable ошибка
  • Manual control ошибка