在销毁分配之前声明对象属性类型

问题描述

让我们假设有一个函数返回一个对象,该对象的属性类型可以推断或显式提供:

const myFn = (arg: number) => {
    return {
        a: 1 + arg,b: 'b' + arg,c: (() => { return arg + 'c'})()
    }
}

然后我们可以解构返回的对象并分配给新变量:

const { a,b,c } = myFn(10);
console.log('used once',a,c);

一切都很好,花花公子。现在,我们假设以后需要将这些变量重新分配给相同的变量,尤其是在switch语句中。为了防止Cannot redeclare block-scoped variable 'xyz'. ts(2451),我们将充分利用assignment without declaration并按以下步骤进行操作:

let my_a,my_b,my_c;

switch (true) {
    case Math.random() < 0.5:
        ({a: my_a,b: my_b,c: my_c} = myFn(Math.random()));
        console.log('called at one point',my_a,my_c);
    default:
        ({a: my_a,c: my_c} = myFn(Math.random()));
        console.log('called at another point',my_c);
}

然后的问题是,当我知道my_amy_b等类型并且不想手动键入它们时,如何声明/提取它们? Here's a playground snippet


ELABORATION

我正在寻找的是一种在使用初始化var时声明类型的方法

let my_a,my_c;

基于我对myFn签名的了解,以防止发生

Variable 'my_a' implicitly has an 'any' type,but a better type may be inferred from usage. ts(7043)

解决方法

您可以声明一个接口,并将切换逻辑放在匿名箭头函数内:

interface Alphabet {
    a: number,b: string,c: string,}

const myFn = (arg: number): Alphabet =>  {
    return {
        a: 1 + arg,b: 'b' + arg,c: (() => { return arg + 'c'})()
    }
}

let my_a,my_b,my_c;

switch (true) {
    case Math.random() < 0.5:
        () => {
            const {a: my_a,b: my_b,c: my_c}: Alphabet = myFn(Math.random());
            console.log('called at one point',my_a,my_c);
        }
    default:
        () => {
            const {a: my_a,my_c);
        }
}
,

如果只想提前显式键入$('.ui.dropdown').dropdown({ action: 'select' }); 变量,则可以通过深入研究函数的返回类型来实现。

my_*

let my_a: ReturnType<typeof myFn>['a'],my_b: ReturnType<typeof myFn>['b'],my_c: ReturnType<typeof myFn>['c']; typeof myFn获取函数类型,以便类型系统可以使用它。 myFn将获得函数返回的类型。最后,ReturnType<...>将从该返回类型获得['a']属性。

Playground


但这并不是必需的。您的游乐场代码片段可以正确推断所有内容,并且不会引起类型错误。所以我会考虑这是否真的必要。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...