TypeScript函数返回类型为null(如果参数为null)

时间:2019-02-06 12:40:08

标签: typescript function types

我想让Typescript知道,如果传递给函数的dbUser参数不为null,则结果肯定不会为null。

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div id="container">

</div>

基本上,我可以肯定地知道,如果dbUser参数不为null,则结果也不会。如何以这种方式定义功能? 当前,当我使用非null参数调用getUser函数时,它仍然说结果可能为null,我肯定不会知道。

1 个答案:

答案 0 :(得分:6)

有几种选择。您可以将函数声明与重载一起使用:

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

您还可以使用箭头功能和键入样式来重载,但它们看起来更难看:

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)

我推荐第一个选项,它是最干净的,与其他两个选项不同,它不需要键入断言。