在 C# 中使用不可为 null 的引用类型时 您可以注释输入参数以在方法返回 false 时显示它不为 null:
// From string
bool IsNullOrEmpty([NotNullWhen(false)] string? value)
// User code
string? userInput = GetUserInput();
if (!string.IsNullOrEmpty(userInput))
{
int messageLength = userInput.Length; // no null check needed.
}
// null check needed on userInput here.
假设我在 Typescript 中有类似的东西:
// Helper method
isNullOrEmpty(s: string | undefined | null): boolean
// User code
const userInput = getUserInput();
if (!isNullOrEmpty(userInput))
{
const messageLength = userInput.length; // Typescript complains here
} ^^^^^^^^^^^^^^^^
有没有办法定义
isNullOrEmpty
来帮助 Typescript 中的类型系统在方法返回 true 时确定输入参数不为 null 或未定义?
Typescript 指的是缩小类型范围的代码(例如,确定它是其可能类型的特定子集)作为“类型保护”,例如,
typeof
可以用作类型保护:
const userInput = getUserInput();
if (typeof userInput === 'string')
{
const messageLength = userInput.length; // Typescript has no complaints
}
这可以起到积极或消极的作用:
const userInput = getUserInput();
if (typeof userInput !== 'object' && typeof userInput !== 'undefined')
{
const messageLength = userInput.length; // Typescript has no complaints
}
当然,有很多方法可以缩小类型范围,例如使用
if (userInput)
检查虚假值(尽管这会拒绝空字符串,这可能是不可取的 - 如果您愿意,可以使用 if (userInput || userInput === '')
),或 if (userInput !== null && userInput !== undefined)
。
是的,还有“用户定义的类型保护”,允许您定义这些事情何时为真。这里的等价物是:
isNullOrEmpty(s: string | undefined | null): s is undefined | null {
return !s && s !== ''; // or however you want to define it
}
const userInput = getUserInput();
if (!isNullOrEmpty(userInput))
{
const messageLength = userInput.length; // Typescript has no complaints
}
s is string
语法表示用户定义的类型保护,并替换您的boolean
返回类型。该函数仍预计返回一个 boolean
值,其中 true
表示该变量具有指定的类型,而 false
表示它没有。
请注意,Typescript 不会检查以确认您在用户定义类型保护主体中编写的代码实际上证明该值具有您所说的类型。从类型安全的角度来看,它与强制转换基本相同 - Typescript 将检查的唯一一件事是较宽类型和较窄类型彼此之间是否有足够的相关性,以至于它“可能”是正确的。因此,如果可能的话,最好使用非用户定义的类型保护。