Spec-Zone.ru › TypeScript 5.1

Символы

Начиная с ECMAScript 2015, symbol является примитивным типом данных, как и number и string.

Значения symbol создаются путем вызова конструктора Symbol.

let sym1 = Symbol();

let sym2 = Symbol("key"); // optional string key

Символы неизменяемы и уникальны.

let sym2 = Symbol("key");
let sym3 = Symbol("key");

sym2 === sym3; // false, symbols are unique

Как и строки, символы могут использоваться в качестве ключей для свойств объектов.

const sym = Symbol();

let obj = {
  [sym]: "value",
};

console.log(obj[sym]); // "value"

Символы также могут комбинироваться с вычисленными объявлениями свойств для объявления свойств объектов и членов классов.

const getClassNameSymbol = Symbol();

class C {
  [getClassNameSymbol]() {
    return "C";
  }
}

let c = new C();
let className = c[getClassNameSymbol](); // "C"

unique symbol

Для возможности рассматривать символы как уникальные литералы доступен специальный тип unique symbol. unique symbol является подтипом symbol, и создаются только при вызове Symbol() или Symbol.for(), или из явных аннотаций типов. Этот тип разрешен только в объявлениях const и свойствах readonly static , а для ссылки на конкретный уникальный символ необходимо использовать оператор typeof . Каждая ссылка на уникальный символ подразумевает совершенно уникальную идентичность, связанную с данным объявлением.

declare const sym1: unique symbol;
 
// sym2 can only be a constant reference.
let sym2: unique symbol = Symbol();
 
// Works - refers to a unique symbol, but its identity is tied to 'sym1'.
let sym3: typeof sym1 = sym1;
 
// Also works.
class C {
  static readonly StaticSymbol: unique symbol = Symbol();
}

Поскольку каждый unique symbol имеет совершенно отдельную идентичность, два типа unique symbol не могут быть присвоены или сравнены друг с другом.

const sym2 = Symbol();
const sym3 = Symbol();
 
if (sym2 === sym3) {
  // ...
}

Хорошо известные символы

Помимо пользовательских символов, существуют хорошо известные встроенные символы. Встроенные символы используются для представления внутренних поведений языка.

Вот список хорошо известных символов:

Symbol.asyncIterator

Метод, возвращающий асинхронный итератор для объекта, совместимый для использования с циклом for await..of.

Symbol.hasInstance

Метод, определяющий, распознает ли объект-конструктор объект как один из экземпляров конструктора. Вызывается семантикой оператора instanceof.

Symbol.isConcatSpreadable

Булево значение, указывающее, что объект должен быть распакован до своих элементов массива методом Array.prototype.concat.

Symbol.iterator

Метод, возвращающий стандартный итератор для объекта. Вызывается семантикой оператора for-of.

Symbol.match

Метод регулярного выражения, сопоставляющий регулярное выражение со строкой. Вызывается методом String.prototype.match.

Symbol.replace

Метод регулярного выражения, заменяющий совпадающие подстроки строки. Вызывается методом String.prototype.replace.

Symbol.search

Метод регулярного выражения, возвращающий индекс в строке, который соответствует регулярному выражению. Вызывается методом String.prototype.search.

Symbol.species

Функциональное свойство, которое является конструктором функции, используемой для создания производных объектов.

Symbol.split

Метод регулярного выражения, разбивающий строку на индексы, соответствующие регулярному выражению. Вызывается методом String.prototype.split.

Symbol.toPrimitive

Метод, преобразующий объект в соответствующее примитивное значение. Вызывается абстрактной операцией ToPrimitive.

Symbol.toStringTag

Строковое значение, используемое при создании стандартного строкового описания объекта. Вызывается встроенным методом Object.prototype.toString.

Symbol.unscopables

Объект, собственные имена свойств которого являются именами свойств, исключаемых из связываний среды «with» ассоциированных объектов.

© 2012-2023 Microsoft
Licensed under the Apache License, Version 2.0.
https://www.typescriptlang.org/docs/handbook/symbols.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API