関数に渡されたdbuserパラメータがnullではない場合、その結果が確実にNULLにならないことをTypesScriptに知らせたいと思います。
type GetUser = (dbUser: DbUser | null) => GqlUser | null;
const getUser: GetUser = (dbUser) => {
if(!dbUser) return null;
return ... //gql user
};
const dbUser = { ... some fields} //not null for sure
getUser(dbUser) //here I want TypeScript to know that the result will not be null
_
基本的に、dbuserパラメータがnullでない場合、結果はどちらでもないことを確認します。このように機能を定義する方法は?現在、NULL以外のパラメータを使用してgetUser関数を呼び出すと、結果がNULLになる可能性があると言っています。
いくつかのオプションがあります。オーバーロードで関数宣言を使用できます。
function getUser(dbUser: null) : null;
function getUser(dbUser: DbUser) : GqlUser;
function getUser(dbUser: DbUser | null) : GqlUser | null;
function getUser(dbUser: DbUser | null): GqlUser | null {
if(!dbUser) return null;
return null! //gql user
}
const dbUser = null! as DbUser
getUser(dbUser) // GqlUser
_
矢印関数とタイプスタイルでオーバーロードを取得することもできますが、それらはUllierに見えます。
type GetUser = {
(dbUser: null) : null;
(dbUser: DbUser) : GqlUser;
(dbUser: DbUser | null) : GqlUser | null;
}
const getUser = ((dbUser: DbUser | null): GqlUser | null => {
if(!dbUser) return null;
return null! //gql user
}) as GetUser
const dbUser = null! as DbUser
getUser(dbUser)
_
条件付きタイプを使用することもできます。
type GetUser = <T extends DbUser | null>(dbUser: T) => T extends DbUser ? GqlUser : null;
const getUser: GetUser = (dbUser) => {
if (!dbUser) return null;
return {} as any // assertions will be required to get a value into the conditioanl type
};
const dbUser = null! as DbUser //not null for sure
getUser(dbUser)
_
私は最初のオプションをお勧めします。それは最もクリーンなものであり、他の2つと違って種類のアサーションを必要としません。