在析构函数赋值之前声明对象属性类型



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

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, b, c);

一切都很美好。现在,让我们假设我们稍后需要重新分配给这些相同的变量,更具体地说,在switch语句中。为了防止Cannot redeclare block-scoped variable 'xyz'. ts(2451),我们将利用没有声明的分配,并按照以下方式进行:

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_b, my_c);
default:
({a: my_a, b: my_b, c: my_c} = myFn(Math.random()));
console.log('called at another point', my_a, my_b, my_c);
}

那么,问题是,当我知道my_amy_b等的类型是什么并且不想手动键入它们时,我如何声明/提取它们?这是一个操场片段。


ELABORATION

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

let my_a, my_b, my_c;

基于我所知道的myFn的签名来防止

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

如果只想提前显式键入my_*变量,那么可以通过深入函数的返回类型来实现。

let my_a: ReturnType<typeof myFn>['a'],
my_b: ReturnType<typeof myFn>['b'],
my_c: ReturnType<typeof myFn>['c'];

typeof myFnmyFn中获取函数类型,以便类型系统可以使用它。ReturnType<...>将获取函数返回的类型。最后,['a']将从该返回类型中获得a属性。

游乐场


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

您可以声明一个接口,并将开关逻辑放置在匿名箭头函数中:

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_b, my_c);
}
default:
() => {
const {a: my_a, b: my_b, c: my_c}: Alphabet = myFn(Math.random());
console.log('called at one point', my_a, my_b, my_c);
}
}

最新更新