typescriptでジェネリック型を非常に簡単に定義でき、渡されたジェネリック型に関してすべてのフィールドをオプションにすることができます。このようなタイプのクエリは、すべてのフィールドを取得する必要がなく、オプションのタイプ指定で検証できるため、mongoクエリの結果を定義するためのタイプ定義で非常に役立ちます。
https://www.typescriptlang.org/docs/handbook/advanced-types.html
interface Person {
name: string;
age: number;
}
type Partial<T> = {
[P in keyof T]?: T[P];
}
const p : Partial<Person> = {
name:"A"
}
フローを使用して同じことを定義する方法。$ Keysを使用できます。しかし、タイプスクリプトで行ったように、別のタイプを定義している間はそのタイプを取得できません。-[TのキーのP] ?: T [P]; Pをフローに入れることができません。https://flow.org/en/docs/types/utilities/#toc-keys
type Person = {
name: string,
age: number;
}
type Partial<T> = {
[$Keys<T>] : 1; // doubt here how to get type of prop comes in left
}
const p : Partial<Person> = {
name:"A"
}
実際クエリの型仕様を作成しようとしています。指定されていないキーにもnullまたはundefinedを指定することはできません。
type Department = {
_id : string,
name : string,
type : string
}
type Person = {
_id : string,
name : string,
age : number,
department : Department
}
type Query <T> = {
[P in keyOf T ]?: 1 | Query<T[P]>
}
type Document<T> = {
[P in keyOf T ]?: T[P] | Document<T[P]>
}
const personDepartments : Query<Person> = {
name:1, department :{name:1}
}
このクエリは次のような結果を返します
{_id:"1",name:"abc",department:{name:"xyz"}}
ドキュメントタイプにすることができます
const a : Document<Person> = {_id:"1",name:"abc",department:{name:"xyz"}}
したがって、次のように関数を書くことができます
function getResult<T>(query:Query<T>) : Document<t> {
// code here to query and get result
}
TypeScriptでは非常に簡単です。ですから、フローにも回避策があるはずです。
$ Shapeユーティリティを使用できます。
指定されたタイプの形状をコピーしますが、すべてのフィールドをオプションとしてマークします
type Foo = {
A: string,
B: number,
C: string
};
const t: $Shape<Foo> = {
A: 'a'
};
別のアプローチは、タイプを「拡散」することです(申し訳ありませんが、changelog以外のドキュメントは見つかりません):
type Foo = {
A: string,
B: number,
C: string
};
type Partial<T> = { ...T };
const t: Partial<Foo> = {
A: 'a'
};
今では本当に部分的で、キーをスキップできます。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加