Пример кода
type Percentage = number;
class Foo {
applyBonus(bonus: Percentage | number) {
if (typeof bonus === 'Percentage') {
console.log('Percent');
} else {
// NO, IT IS NOT ALWAYS NUMBER BECAUSE OF THAT
console.log('number');
}
}
}
let bar = new Foo();
bar.applyBonus(5);
bar.applyBonus(6 as Percentage);
Реальная причина
JavaScript
JavaScript, а также любой другой язык программирования, поставляется с набором примитивных значений. Которые, поскольку es6
равны Шесть
- число
- строка
- логическое
- undefined
- null
- символ
Как вы могли заметить, Percentage
не является одним из них.
то, что может быть правильным из вашего execution time we're in javascript land here
утверждения, является фактом типы «не существуют на JS» ... не совсем верно, поскольку типы существуют в JS, но скомпилированный код из вашего примера выглядит примерно так
class Foo {
applyBonus(bonus) {
if (typeof bonus === 'Percentage') {
console.log('Percent');
} else {
console.log('number');
}
}
}
let bar = new Foo();
bar.applyBonus(5);
bar.applyBonus(6);
, если мы посмотрим на bar.applyBonus
вы передаете 5 n 6 , которые являются двумя примитивными значениями, поскольку оба они являются числами
, если вы не верите, что я открываю консоль в браузере и вставьте это typeof 5
и «Процент»! == «число»
именно поэтому вы всегда попади внутрь остального. Единственный способ получить instanceof
процент - это создать процент вызова объекта:
class Percentage {
constructor (value) {
this.value = value;
}
}
class Foo {
applyBonus(bonus) {
if (bonus instanceof === Percentage) {
console.log('Percent');
} else {
// NO, IT IS NOT ALWAYS NUMBER BECAUSE OF THAT
console.log('number');
}
}
}
let bar = new Foo();
bar.applyBonus(5);
bar.applyBonus(new Percentage(6));