Typescript-funktion returnerar typ null om parameter är null
Jag vill låta Typescript veta att om parametern dbUser som skickas till funktionen inte är null, så kommer resultatet definitivt inte att vara 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
I princip vet jag med säkerhet att om dbUser-parametern inte är null, kommer inte heller resultatet att vara det. Hur kan jag definiera funktionen på ett sådant sätt? För närvarande, när jag anropar getUser-funktionen med en icke-null parameter, säger den fortfarande att resultatet kan vara null, vilket jag vet med säkerhet inte kan.
Svar #1
Det finns flera alternativ. Du kan använda en funktionsdeklaration med överlagringar:
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
Du kan också få överbelastningar med pilfunktionen och typstilen, men de ser fulare ut:
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)
Du kan också använda villkorliga typer:
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)
Jag skulle rekommendera det första alternativet, det är det renaste och kräver inga typförutsättningar till skillnad från de andra två.
