我想让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,我肯定不会知道。
答案 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)
我推荐第一个选项,它是最干净的,与其他两个选项不同,它不需要键入断言。