对于TypeScript,您没有运行时保证,所以我想知道在哪里真正检查函数param是否存在。
信任TypeScript,假设someRequiredParam永远不会是未定义或空的:
function myFunc(someRequiredParam: { foo: string, bar: string }) {
return JSON.stringify(someRequiredParam);
}
这将在编译时正常工作,但在运行时可能会发生故障。
不信任TypeScript,但是为什么要使用所需的params呢?
function myFunc(someRequiredParam: { foo: string, bar: string }) {
if (isText(someRequiredParam?.foo) && isText(someRequiredParam?.bar)) {
return JSON.stringify(someRequiredParam);
}
}
如果您已经按要求输入了这些运行时检查,那么这些检查似乎是多余的。
在上述情况下,我最好将param及其嵌套的道具定义为可选的。
function myFunc(someRequiredParam?: { foo?: string, bar?: string }) {
if (isText(someRequiredParam?.foo) && isText(someRequiredParam?.bar)) {
return JSON.stringify(someRequiredParam);
}
}
但是,在dev/编译时,您会丢失强类型,这似乎不对。
当然,在将值传递给函数之前,您也可以检查这些值是否存在,但是依赖这些值似乎也不正确。
我认为使用您可以信任的声音类型系统要容易得多,例如,在ReScript中,代码编译后不会出现这些运行时错误,因为语言迫使您处理相当于TS/JS中的空/未定义的情况。
但是我很想知道,人们是如何利用TypeScript的,这样就不会因为只在编译时捕获错误而给您一种错误的安全感。人们通常做的是使用很多类型的护卫吗?您是否在函数内部使用它们来检查运行时是否存在所需的params?
发布于 2022-09-07 12:19:46
如果您在您自己的模块的边界内,并且在TypeScript中是安全键入的,那么您可以信任您的类型签名。
如果您正在与另一个系统或服务器交互,那么当来自外部源的数据移动到您的模块中时,一定要添加检查。
TypeScript主要是声音。根据我的经验,如果您注意边界,那么在生产类型中错误是相当罕见的。
https://stackoverflow.com/questions/73640965
复制相似问题