Можно ли использовать безопасность типов с символами? - PullRequest
0 голосов
/ 05 сентября 2018

Глядя на это Машинописный код :

class A {

} 

let a = new A();
let s: symbol = Symbol('sym');

a[s] = 2;
a[s] = 'f';
a[s] = new Date();

//no errors

Мы видим, что это же символическое свойство ссылается на типы различий.

Вопрос:

Можно ли использовать символ и, тем не менее, получить безопасность типа TS?

Ответы [ 2 ]

0 голосов
/ 05 сентября 2018

Если вы включите noImplicitAny, вы получите ошибки во всех трех назначениях, потому что свойство символа не объявлено, а A не имеет подписи индекса. Вы можете объявить свойство следующим образом:

const s: unique symbol = Symbol('sym');
class A {
  [s]: number;
}

let a = new A();

a[s] = 2;  // OK
a[s] = 'f';  // Error
a[s] = new Date();  // Error

(Обратите внимание, что называть Symbol('sym') a unique symbol немного неправдоподобно. Попробуйте вместо этого использовать Symbol(). Я помню, как обсуждалась проблема, но сейчас не могу ее найти.)

0 голосов
/ 05 сентября 2018

TS1023: тип параметра подписи индекса должен быть 'string' или 'Число'.

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

class A {
  [key: symbol]: any; // invalid
} 

Ты ищешь что-то подобное?

class A {
  [key: string]: number | string | Date;
  [key: number]: number | string | Date;
}

const a = new A();
const s: symbol = Symbol('sym');

a[s] = 2;
a[s] = 'f';
a[s] = new Date();
...