在 TypeScript 中输入 gql-tag

Posted

技术标签:

【中文标题】在 TypeScript 中输入 gql-tag【英文标题】:Type gql-tag in TypeScript 【发布时间】:2019-01-28 19:00:09 【问题描述】:

我正在使用 GraphQL,我希望严格输入 gql。是否可以将 result 变量设置为 ResultData 的形状,即使用最新版本的 TypeScript。这只是关于打字,而不是关于运行时。

interface Data 
    one: string;
    two: number;
    three: 
        four: string;
        five: 
            six: Date;
        ;
    ;


// true means that this field must be added to query
type RecursivePartial<T> = [P in keyof T]?: RecursivePartial<T[P]> | true;

function gql<T>(fields: RecursivePartial<T>) 
  // Some code about generating GraphQL query


const result = gql<Data>(one: true, three: five: six: true);

// type ResultData 
//     one: string;
//     three: 
//         five: 
//             six: Date;
//         ;
//     ;
// 

【问题讨论】:

【参考方案1】:

这在操场上对我有用:

interface Data 
    one: string;
    two: number;
    three: 
        four: string;
        five: 
            six: Date;
        ;
    ;


// Prevent widening of true to boolean in queries
type RecursivePartial1 =  [k: string]: RecursivePartial1 | true ;
// true means that this field must be added to query
type RecursivePartial<T> = RecursivePartial1 &  [P in keyof T]?: RecursivePartial<T[P]> | boolean ;

type RecursivePick<T, Q extends RecursivePartial<T>> =
   [P in keyof T & keyof Q]:
    Q[P] extends RecursivePartial<T[P]> ? RecursivePick<T[P], Q[P]> : T[P] ;

function gql<T, Q extends RecursivePartial<T>>(data: T, fields: Q): RecursivePick<T, Q> 
  // Some code about generating GraphQL query


declare const data: Data;
const result = gql(data,  one: true, three:  five:  six: true   );

// type ResultData 
//     one: string;
//     three: 
//         five: 
//             six: Date;
//         ;
//     ;
// 

【讨论】:

感谢您的回答。我将此代码复制到 TypeScript 操场上,TS 允许我访问我在 gql const result = gql(data, one: true, three: 五: Six: true 中没有选择的属性); const another = result.three.four; // 没有错误,但是我没有选择上面的four属性 糟糕,为了简化RecursivePick 的定义,我把它弄坏了。请重试。

以上是关于在 TypeScript 中输入 gql-tag的主要内容,如果未能解决你的问题,请参考以下文章

在 TypeScript 中输入 gql-tag

如何使用 Angular 2 / Typescript 限制输入字段中的特殊字符

如何在 Typescript 中输入 Object.entries() 和 Object.fromEntries?

在反应 TypeScript 中键入输入的键值 [重复]

typescript 用于在输入中显示/隐藏密码的Angular7指令

typescript 用于在输入中显示/隐藏密码的Angular7指令