Если вы просто выполняете проверку типов/утверждение, вы можете использовать instanceof. Если вам действительно нужно напечатать имя класса, вы можете попробовать data.constructor.name:
class TestClass {}
var instance = new TestClass();
console.log(typeof instance);
// Expected output: "object"
console.log(instance.constructor.name);
// Expected output: "TestClass"
if (instance instanceof TestClass) {
console.log("instance is TestClass");
}
// Expected output: "instance is TestClass"
Что касается почему: typeof работает только со встроенными типами данных JavaScript, такими как строка, логическое значение, объект и т. д. Если вы посмотрите, как TypeScript транспилируется в JavaScript, и вы поймете, почему во время выполнения JavaScript знает только то, что ваш экземпляр является «объектом».
Обновлено
Это будет работать только с экземплярами, созданными с помощью конструктора new class(). Здесь HttpClient на самом деле не создает для вас экземпляр вашего класса — он просто позволяет вам (в целях разработки) указать с помощью TypeScript тип данных, которые вы ожидаете получить в ответе. Насколько мне известно, HttpClient ничего не делает, чтобы гарантировать (во время выполнения), что данные ответа фактически соответствуют этим ожиданиям. Если вам требуется строгая проверка типов во время выполнения, вам, вероятно, потребуется написать собственную функцию защиты типов.
Итак, если у вас есть такой класс:
class TestClass {
prop: string;
constructor() { }
method(): void {}
}
Вы можете написать защиту типа следующим образом:
function isTestClass(obj: TestClass | object): obj is TestClass {
// add whatever type checking logic you need here
return (<TestClass>obj).method !== undefined &&
(<TestClass>obj).prop !== undefined;
}
И проверьте свои данные во время выполнения:
var obj_a = { prop: "" },
obj_b = { prop: "", method: null };
console.log(isTestClass(obj_a));
// Expected output: false
console.log(isTestClass(obj_b));
// Expected output: true
Я мог бы сделать функцию защиты типа статическим методом моего класса.
Кроме того, вы можете рассмотреть возможность использования интерфейса для ваших данных ответа вместо класса - в основном потому, что это может помочь интуитивно понять, что данные, которые вы получили, могут иметь или не иметь реализацию, которую вы ожидаете.
Дополнительные сведения о защите типов, определяемых пользователем, см. на странице https://www.typescriptlang.org/docs/handbook/advanced-types.html
person
Chris Yeager
schedule
04.03.2018
ValorTest
- person yurzui   schedule 04.03.2018