gpt4 book ai didi

如果参数为 null,Typescript 函数返回类型为 null

转载 作者:搜寻专家 更新时间:2023-10-30 21:03:21 27 4
gpt4 key购买 nike

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

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 参数调用 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

你也可以使用箭头函数和类型样式来重载,但它们看起来更丑陋:

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)

我会推荐第一个选项,它是最干净的,并且不需要与其他两个不同的类型断言。

关于如果参数为 null,Typescript 函数返回类型为 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54553892/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com