首页 > 解决方案 > 如何在打字稿中使属性可选但不是未定义的

问题描述

当您创建具有如下可选属性的打字稿界面时:

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 但我们为其分配了一个默认值,因此它不能是未定义的。

标签: typescriptobjectinterface

解决方案


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");
}

推荐阅读