Почему некоторые из этих кодов не могут повторять значения в карте в машинописи? - PullRequest
0 голосов
/ 12 февраля 2019

Я пробую некоторые идиомы машинописного текста, как описано в ответах на этот вопрос SO ( Перебор по карте машинописного текста ) в Codepen .

Вот мой код,

class KeyType {
  style: number;
  constructor(style) {
    this.style = style;  
  };
}

function test() {


  const someMap = new Map<KeyType, number>();
  someMap.set(new KeyType(style=199), 5);
  someMap.set(new KeyType(style=67), 90);

 console.log('test of 1')

  for (let [k, m] of someMap) {
    console.log(`1 k ${k} m ${m}`);
  }

   console.log('test of 2')

  for (let [k, m] of someMap.entries()) {
    console.log(`2 k ${k} m ${m}`);
  }

   console.log('test Object entries')

  for (let [k, m] of Object.entries(someMap)) {
    console.log(`3 k ${k} m ${m}`);
  }

  console.log('for each')

  someMap.forEach((v, id) => console.log(`3 v ${v} id ${id}`))

  Array.from(someMap.entries()).forEach(entry =>
    console.log(`4 k ${entry[0].style} m ${entry[1]}`)
  )

  const ar = Array.from(someMap.keys());
  console.log(ar[0].style);

}

Что я не понимаю, так это: все методы forEach работают, как и ожидалось, но for (let [k,m] of someMap) {..., похоже, совсем не работает.

Может ли это бытьпроблема с настройкой машинного кода codepen?Я допустил какую-либо ошибку с test of 1, test of 2 и test Object entries в приведенном выше коде?

Я хотел установить ts-node для локального тестирования, но до сих пор у меня возник другой набор проблем, касающихся егомонтаж.

1 Ответ

0 голосов
/ 12 февраля 2019

Во-первых, давайте исправим ваши ошибки.

someMap.set(new KeyType(style=199), 5);

Это недопустимый синтаксис JavaScript / TypeScript.Если вы хотите, чтобы 199 был вашим аргументом, запишите его как:

someMap.set(new KeyType(199), 5);

Вторым моментом является то, как ваш класс KeyType сериализуется с целью печати на консоль.

  for (let [k, m] of someMap) {
    console.log(`1 k ${k} m ${m}`);
  }

Здесь k представляет KeyType, который в вашей области представляет класс.Среда выполнения JavaScript сериализует классы, возвращая "[object] Object", что, как я полагаю, не то, что вы хотели.

Если вы намеревались зарегистрировать style вашего KeyType, замените его следующим:

  for (let [k, m] of someMap) {
    console.log(`1 k ${k.style} m ${m}`);
  }

Окончательный результат можно проверить на TypeScript Playground .


Примечание : распространенным источником путаницы является переменное затенение.Ваш класс называется KeyType, но есть также глобальный тип, называемый тем же.

type KeyType = "public" | "private" | "secret";

Если ваш код находится в файле без каких-либо операторов импорта / экспорта, он будет рассматриваться как скрипт а не модуль .Это означает, что глобальный тип будет иметь приоритет, и если вы попытаетесь вызвать его по new KeyType(), вы получите ошибку времени компиляции:

«KeyType» относится только к типу, но в настоящее времяздесь используется как значение.

...