Получить параметры типа c в машинописном тексте - PullRequest
0 голосов
/ 24 апреля 2020

Итак, я не знаю, возможно ли это в машинописи, но вот что я хочу сделать:

Использовать класс, который получает обобщенный c, для создания запроса GraphQL

class BackendClient<T> {
    type: string
    endpoint: string
    query: Object
    constructor(type: string, endpoint: string, query: Object) {
        this.type = type
        this.endpoint = endpoint
        this.query = query
    }

    async doQuery(): Promise<T> {
        var data: string
        data = `${this.type} { ${this.endpoint}(`
        Object.getOwnPropertyNames(this.query).forEach(element => {
            data += `${element}: ${this.query[element]},`
        })
        data += `) {`
        T.parameters.forEach(element => { 
            data += `${element},`
        })
        data += `} }`
        return await axios({
            url: constants.ApiUrl,
            method: 'post',
            data: {
                query: data
            }
        }) as T
    }
}

Так, например, у меня есть код, который делает это

interface Search {
    title: string
}

interface Response {
    id: number
    title: string
    image_url: string
}

async function main() {
    var search: Search = { title: "a" }
    var client = new BackendClient<Response>('query', 'search', search)
    console.log(await client.doQuery())
}

main()

Как получить параметры отклика на BackendClient?

1 Ответ

1 голос
/ 24 апреля 2020

Параметр - это довольно расплывчатое слово в этом контексте, и оно в некоторой степени зависит от того, какова ваша цель, но звучит так, как будто вы хотите знать, какие имена свойств имеет параметр generi c, а затем использовать его в некоторых другой тип?

Если это так, вы можете сделать это с помощью keyof. Это даст вам объединение всех ключей в любом объекте, который имеет свойства.

type Keys = keyof { a: 123, b: 'string', c: true } // 'a' | 'b' | 'c'

Чтобы добавить метод в ваш класс, который возвращает все имена свойств вашего параметра generi c, вы можете наберите вот так:

class BackendClient<T> {
    getGenericProperties(): (keyof T)[] {
        // skipping implementation
        return 'any' as any
    }
}

interface ResponseData {
    id: number
    title: string
    image_url: string
}

const client = new BackendClient<ResponseData>()
const properties = client.getGenericProperties()
// inferred type: ("id" | "title" | "image_url")[]

Детская площадка

...