typescript - 如何在打字稿中使属性可选但不是未定义的
问题描述
当您创建具有如下可选属性的打字稿界面时:
interface X {
a?: string
}
这x.a
是类型string | undefined
所以打字稿会抱怨以下代码:
function stringValue(value: string):void{}
function test(x:X){
// error, because stringValue() only accepts strings
stringValue(x.a)
}
但是,如果 Typescriptx.a
事先知道价值,为什么它仍然抱怨?
function test(x:X){
x = { a:"string value" }
// now x.a is string, not string | undefined
// so the following code must be valid
// but TS still complains
stringValue(x.a)
// this is a workaround but out of my question's scope
stringValue(x.a as string)
}
如何告诉打字稿我们函数的使用者不必提供值,x.a
但我们为其分配了一个默认值,因此它不能是未定义的。
解决方案
TypeScript 不会缩小将具有绝对未定义x
属性的新对象分配给它的类型。a
它的类型保持不变X
,这就是您收到错误的原因。
这可以编译,但会发生变异x
:
function test(x: X) {
x.a = "string value";
stringValue(x.a);
}
但这可能不是您想要的:您没有为 分配默认值x.a
,而是替换了x.a
从参数中获得的值。换句话说,您的test
功能与调用相同stringValue("string value")
。
提供默认值的正确方法是:
function test(x: X) {
stringValue(x.a ?? "string value");
}
推荐阅读
- git - Git 与一个分支中修改的数据合并,而其他分支中没有做任何事情
- javascript - \n 没有在新行中呈现文本
- angular - 我可以同时映射到 Observables,通过管道传输到 mergeMap -> forkJoin 并将对象传递到 RxJs 中的下游吗?
- node.js - 如何在运行 apache 的 aws ec2 的自动分配 IP 中启用 ssl?
- python - 为什么我可以在 Pandas DataFrames 上使用 numpy 函数?
- ios - 在 iPhone 7 Plus 上实现自定义触觉(具有不同的清晰度和强度)时遇到问题
- reactjs - 无法在编辑模式下为 react-admin 上传带有 ImageField 的图像
- .net - 如何使用 .NET 检查 SerialPort 奇偶校验错误
- vespa - vespa.ai 中的自然语言处理
- javascript - 如何导出动态?