Свойство ‘x’ не существует для типа ‘typeof Socket’, хотя оно у меня объявлено

#angular #ionic-framework #ionic2

#angular #ionic-framework #ionic2

Вопрос:

Это мой класс.

 import { Injectable } from '@angular/core';
import { Events } from 'ionic-angular';

@Injectable()
export class Socket {

  public isConnected: boolean = false;

  constructor(public events: Events) {
    console.log("Socket.js constructed.");
  }
}
  

Я использую его как:

 import { Socket } from '../App/Socket/Socket';
@Component({
  templateUrl: 'layout.html'
})
export class ConferenceApp {
    constructor() {
        console.log(Socket.isConnected);
    }
}
  

Однако я получаю Property 'isConnected' does not exist on type 'typeof Socket' сообщение об ошибке при запуске ionic serve.

Typescript не поддерживает значения, которые должны быть прикреплены к области видимости класса?

Спасибо.

Комментарии:

1. поделиться кодом ../App/Socket/Socket ? есть ../App/Socket/Socket ли service ?

Ответ №1:

То, как вы его используете здесь

 console.log(Socket.isConnected);
  

isConnected должно быть статическим свойством вместо созданного вами свойства экземпляра.

Я предполагаю, что вы все равно хотите использовать его по-другому, потому что вы добавили @Injectable() .

Вам нужно где-то предоставить сервис, чтобы иметь возможность его вводить. Я не знаю, было ли NgModule оно уже установлено в ionic, но вы также можете предоставить его в компоненте, если его не нужно использовать совместно с другими компонентами.

Чтобы внедрить его, добавьте его в список параметров конструктора

 import { Socket } from '../App/Socket/Socket';
@Component({
  templateUrl: 'layout.html',
  providers: [Socket]
})
export class ConferenceApp {
    constructor(socket:Socket) {
        console.log(socket.isConnected);
    }
}
  

затем получите к нему доступ, используя параметр конструктора вместо имени класса.

Ответ №2:

Вам нужно создать экземпляр Socket by new Socket() . Тогда вы сможете получить доступ к этому свойству. Вы также можете ввести его с помощью внедрения зависимостей.

Ответ №3:

Ваша проблема в том, что вы используете Socket как static класс, а не используете систему DI angular2.

Это будет работать:

 import { Socket } from '../App/Socket/Socket';
@Component({
  templateUrl: 'layout.html'
})
export class ConferenceApp {
    constructor(socket:Socket) {
        console.log(socket.isConnected);
    }
}
  

Поскольку он использует систему DI angular2, вы получите экземпляр Socket, а не фактический Socket класс.