web-dev-qa-db-ja.com

TypesScript関数戻り値パラメータNULLの場合はNULLを返します

関数に渡された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になる可能性があると言っています。

7
ZenVentzi

いくつかのオプションがあります。オーバーロードで関数宣言を使用できます。

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つと違って種類のアサーションを必要としません。