javascript - 如何使用 Typescript 对具有后备值的解构对象进行类型检查?

标签 javascript typescript ecmascript-6

如何对以下结构中的解构对象进行类型检查?

interface IUser  {
    username: string
    image: string
    uid: string
}

interface IDataProp {
    user: IUser
}

const {
    user: {
        username,
        image,
        uid
    } = {},
} = { ...data, user: data.user || {} }

最佳答案

嗯,这是一个奇怪的场景并且很难涵盖。
我真的不明白你为什么要破坏 data对象并满足user键为data.user值。
编译错误(或类型误导)存在于默认值中。由于分配未应用于强类型对象,因此提供一个空对象的默认值 {} ,所有变量都必须有一个默认值(甚至是显式的 undefined ,取决于 tsconfig.json )。

我想有两种方法。

const {
    user: {
        username,
        image,
        uid
    }
} = { user: data.user || {} };

无默认值user -核心值(value)。现在,所有变量都是 string已输入。
第二种方法,承认默认user值,但还为变量提供显式默认值

const {
    user: {
        username = undefined,
        image = 'default-image',
        uid = '000-000-0'
    } = {}
} = { user: data.user || {} };

这有点多余,在这种情况下,username属于联合 string | undefined 类型...所以它是一个相当弱的类型。
在具有 Typescript 环境的 VSCode 中,如果将鼠标悬停在 user 上关键,编译器现在知道这是一个可选属性 user?: IUser类型 IUser 。这就是为什么我们必须提供默认值。

最后,正如我上面评论的那样,我发现这种情况有点奇怪。您可以简单地解构 data.user对象,甚至带有提供强类型解构的 void null 检查。

const {
    username,
    image,
    uid
}: IUser = { ...data.user || {} };

关于javascript - 如何使用 Typescript 对具有后备值的解构对象进行类型检查?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61071950/

相关文章:

javascript - IE8 不触发 OnClick 事件,但在 Firefox 中工作正常

javascript - 从嵌入脚本中获取 Javascript 中的 ID 作为变量

javascript - 关于Vue双向数据绑定(bind): what if form field content doesn't come from direct user input?

javascript - 我可以使用 this.on 来监听 EventEmitter 中的事件吗?在 javascript 类中寻找 Eventmitter 的正确用法

javascript - 在 ES6 中使用相同的参数名称作为其默认参数

javascript - jquery close() 不起作用

javascript - 如何导入 Typescript 所需的 chrono 库?

angular - 刷新数据和分页状态

angular - 在 App.modules.ts 中注册的模块在其他模块中不可用

node.js - TS2304 : Cannot find name 'Map' in node 5. 1.0, typescript 1.6.2,网络 Storm 11