Как уже упоминалось в парах других, нет способа стилизовать родительский элемент элемента, используя только CSS, но следующее работает с jQuery :
$("a.active").parents('li').css("property", "value");
Этот код TypeScript
class A {
private a1;
public a2;
}
компилируется в этот код JavaScript
class A {
}
Это связано с тем, что свойства в JavaScript начинаются только после того, как они имеют некоторое значение. Вы должны назначить свойства некоторым значениям.
class A {
private a1 = "";
public a2 = "";
}
он компилируется в
class A {
constructor() {
this.a1 = "";
this.a2 = "";
}
}
Тем не менее вы не можете получить свойства из простого класса (вы можете получить только методы из прототипа ). Вы должны создать экземпляр. Затем вы получите свойства, вызвав Object.getOwnPropertyNames()
.
let a = new A();
let array = return Object.getOwnPropertyNames(a);
array[0] === "a1";
array[1] === "a2";
class Describer {
static describe(instance): Array<string> {
return Object.getOwnPropertyNames(instance);
}
}
let a = new A();
let x = Describer.describe(a);
Другое решение. Вы можете просто перебирать объектные ключи так, вы должны сначала создать экземпляр объекта:
printTypeNames<T>(obj: T) {
const objectKeys = Object.keys(obj) as Array<keyof T>;
for (let key of objectKeys)
{
console.Log('key:' + key);
}
}
Только для fun
class A {
private a1 = void 0;
private a2 = void 0;
}
class B extends A {
private a3 = void 0;
private a4 = void 0;
}
class C extends B {
private a5 = void 0;
private a6 = void 0;
}
class Describer {
private static FRegEx = new RegExp(/(?:this\.)(.+?(?= ))/g);
static describe(val: Function, parent = false): string[] {
var result = [];
if (parent) {
var proto = Object.getPrototypeOf(val.prototype);
if (proto) {
result = result.concat(this.describe(proto.constructor, parent));
}
}
result = result.concat(val.toString().match(this.FRegEx) || []);
return result;
}
}
console.log(Describer.describe(A)); // ["this.a1", "this.a2"]
console.log(Describer.describe(B)); // ["this.a3", "this.a4"]
console.log(Describer.describe(C, true)); // ["this.a1", ..., "this.a6"]
Обновление: если вы используете пользовательские конструкторы, эта функция будет ломаться.
Некоторые ответы частично ошибочны, и некоторые факты в них также частично ошибочны.
Ответьте на свой вопрос: Да! Вы можете.
В Typcript
class A {
private a1;
private a2;
}
Создает следующий код в Javascript:
var A = /** @class */ (function () {
function A() {
}
return A;
}());
как @Erik_Cupal , вы можете просто сделать:
let a = new A();
let array = return Object.getOwnPropertyNames(a);
Но это неполное. Что произойдет, если ваш класс имеет собственный конструктор? Вам нужно сделать трюк с Typcript, потому что он не будет компилироваться. Вам нужно назначить любое:
let className:any = A;
let a = new className();// the members will have value undefined
Общее решение будет:
class A {
private a1;
private a2;
constructor(a1:number, a2:string){
this.a1 = a1;
this.a2 = a2;
}
}
class Describer{
describeClass( typeOfClass:any){
let a = new typeOfClass();
let array = Object.getOwnPropertyNames(a);
return array;//you can apply any filter here
}
}
Для лучшего понимания это будет ссылаться в зависимости от контекста.
constructor(callback: {getValue: () => number}) { this.numberValue = callback.getValue(); }
– Markus Ende
30 September 2017 в 18:14