Какое правило наследования или надзора за синтаксисом мне не хватает?

Похоже, это должно сработать для меня, однако я получаю сообщение об ошибке: «Ожидается свойство или подпись».


export interface RestCriteria {
    page: number,
    pageSize: number
}

export interface ResponseMetaData {
    page: number,
    pageSize: number,
    totalRecords: number
}

export interface QueryResponse {
    metaData: ResponseMetaData,
    records: []
}

export interface RestService {

    query: (criteria: RestCriteria) => QueryResponse,

}

class Rest implements RestService
{
    query: (criteria: RestCriteria)  => { //why is this not valid??
        return {
            metaData: {
                page: 1,
                pageSize: 1,
                totalRecords: 1
            },
            records: []
        }
    };
}

export default Rest;
0
cosbor11 18 Дек 2019 в 04:36
Потому что это синтаксис литерала объекта, а не синтаксис class.
 – 
Bergi
18 Дек 2019 в 05:16

2 ответа

На самом деле есть еще одна ошибка: вы возвращали {}, а не QueryResponse (см. мое решение ниже). Что касается ошибки, которую вы упомянули для запрошенного свойства или подписи, ее можно исправить, добавив! после запроса.

Замените свой класс отдыха следующим

class Rest implements RestService
{
    query!: (criteria: RestCriteria) => {
        metaData: {
            page: 1,
            pageSize: 1,
            totalRecords: 1
        },
        records: []
    }
}
0
laserany 18 Дек 2019 в 05:09

В синтаксисе

class Foo {
  prop: X;
}

X - аннотированный тип свойства prop; это не значение свойства prop. Если вы хотите инициализировать свойство, вы должны использовать синтаксис

class Foo {
  prop = Y;
}

Где Y теперь является начальным значением свойства. Вы можете аннотировать и инициализировать, если хотите, например

class Foo {
  prop: X = Y;
}

В любом случае, в вашем коде у вас есть query в качестве вашего свойства, и похоже, что вы пытаетесь его инициализировать ... но вы используете синтаксис аннотации. Таким образом, компилятор пытается интерпретировать (criteria: RestCriteria) => { return { ... как тип и очень расстраивается, когда видит return. Одно из возможных решений - изменить : на =, например:

class Rest implements RestService {
    query = (criteria: RestCriteria): QueryResponse => {
        return {
            metaData: {
                page: 1,
                pageSize: 1,
                totalRecords: 1
            },
            records: []
        }
    };
}

Обратите внимание: если вы только измените : на =, вы получите еще одну ошибку из-за давнишнее ограничение дизайна в TypeScript, microsoft / TypeScript # 3667,, в котором компилятор не смотрит, какой класс implements или extends использовать контекстно введите его свойства. Обойти это можно с помощью дополнительных аннотаций, поэтому у меня есть стрелочная функция, аннотирующая как входной, так и выходной тип (то есть я изменил его с (param: InputType) => valueOfOutputType на (param: InputType): OutputType => valueOfOutputType).

Хорошо, надеюсь, что это поможет; удачи!

Ссылка на код

0
jcalz 18 Дек 2019 в 05:16