Typescript 仅使用键创建Javascript对象,以实现类型安全的graphql查询

Typescript 仅使用键创建Javascript对象,以实现类型安全的graphql查询,typescript,graphql,apollo-client,type-safety,Typescript,Graphql,Apollo Client,Type Safety,我使用一个graphql angular客户端和一个graphql ruby服务器,并希望构建一个类型安全系统,这样其他人就可以编写客户端查询,如果他们编写的查询不允许,就会出错。我不确定这是否真的有必要,但graphql模式位于服务器上。因此,在我的理解中,如果开发人员编写了一个无效的查询,客户机将其发送到服务器,在那里,查询将针对模式执行,客户机将收到一个错误,对吗?如果查询会导致错误,我希望客户端不要发送查询 为此,我编写了本课程: export class RequestQL<re

我使用一个graphql angular客户端和一个graphql ruby服务器,并希望构建一个类型安全系统,这样其他人就可以编写客户端查询,如果他们编写的查询不允许,就会出错。我不确定这是否真的有必要,但graphql模式位于服务器上。因此,在我的理解中,如果开发人员编写了一个无效的查询,客户机将其发送到服务器,在那里,查询将针对模式执行,客户机将收到一个错误,对吗?如果查询会导致错误,我希望客户端不要发送查询

为此,我编写了本课程:

export class RequestQL<request,response> extends Query<response> {
    query:request;
    constructor(apollo,query){
        super(apollo);
        this.query = query;
    }
    document=gql`${convertToString(this.query)}`;
}
然后我尝试编写一个函数(
convertToString
),将该对象解析为graphql查询字符串,但我不想总是用不需要的随机值填充查询。 请求类型可能如下所示:

export interface ListGraphQlRequest {
    list: {
        id
        name
        slug?
        programmingLanguageId
        generatedFromId?
    }
}
有人有解决这个问题的聪明办法吗? 我想要达到的目标: -客户端不能向服务器发送无效的请求。 -开发人员应该直接识别他们是否编写了无效的查询

其他: 如果有人对convertToString()函数感兴趣,我们将:

convertToString(obj){
    let str = "";
    Object.keys(obj).forEach( key => {
        if(typeof obj[key] === 'object'){
            str += key;
            str += this.convertToString(obj[key]);
        }
        else {
            str += `${key}\n`
        }
    })
    return `{\n${str}}`;
}
export interface ListGraphQlRequest {
    list: {
        id
        name
        slug?
        programmingLanguageId
        generatedFromId?
    }
}
convertToString(obj){
    let str = "";
    Object.keys(obj).forEach( key => {
        if(typeof obj[key] === 'object'){
            str += key;
            str += this.convertToString(obj[key]);
        }
        else {
            str += `${key}\n`
        }
    })
    return `{\n${str}}`;
}