Сомнения с объявлением объекта и доступом к свойствам в TypeScript [duplicate]

Самое простое решение - создать функцию JavaScript и вызвать его для обратного вызова Ajax success.

function callServerAsync(){
    $.ajax({
        url: '...',
        success: function(response) {

            successCallback(response);
        }
    });
}

function successCallback(responseObj){
    // Do something like read the response and show data
    alert(JSON.stringify(responseObj)); // Only applicable to JSON response
}

function foo(callback) {

    $.ajax({
        url: '...',
        success: function(response) {
           return callback(null, response);
        }
    });
}

var result = foo(function(err, result){
          if (!err)
           console.log(result);    
}); 
8
задан user655321 7 May 2015 в 00:22
поделиться

5 ответов

0
ответ дан bvdb 27 August 2018 в 16:34
поделиться

Я знаю, что вы говорите, что это странно, но это одна из основных причин, по которой существует TypeScript. Эта ошибка помогает предотвратить случайную настройку или получение несуществующих свойств для объекта.

Прямо сейчас, как компилятор говорит вам, свойство bar не существует на x, поскольку оно неявно набрал {} при записи var x = {};.

Вы можете сказать компилятору, что x имеет больше нуля свойств, явно определяя тип:

var x: { foo?: string; bar?: string; } = {};

Теперь вы могут получить или установить x.foo и x.bar без жалобы компилятора. В большинстве случаев вы переместили бы это в такой интерфейс:

interface IFooBar {
    foo?: string;
    bar?: string;
}

var x: IFooBar = {};

x.foo = "asdf";  // ok
x.test = "asdf"; // error, as it should be

Некоторые люди рекомендуют вам наложить на any, но не ленитесь. Вы должны в полной мере использовать систему типов, предоставляемую TypeScript. Выполнение этого, безусловно, сэкономит вам время, когда вы будете поддерживать приложение.

5
ответ дан David Sherret 27 August 2018 в 16:34
поделиться

x не имеет никакого свойства с именем bar, поэтому вам нужно создать его внутри объекта:

function foobar() {
    var x = {

        foo: 'foo',
        bar: 'bar'
    }

    return x;
}

alert(foobar().bar); //returns bar
0
ответ дан mwilson 27 August 2018 в 16:34
поделиться
0
ответ дан Rich Turner 27 August 2018 в 16:34
поделиться

Из-за строго типизированного характера объекта Виджета вы можете использовать «any», чтобы сделать его нетипизированным:

var x: any = {};
x.bar = "bar";   /// ok

. Если вам нужно определить тип свойств литерала

var x: { [index: string]: TypeA } = {};

, тогда x["bar"] теперь может быть только экземпляром TypeA.

0
ответ дан Val 27 August 2018 в 16:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: