问题描述
让我们假设有一个函数返回一个对象,该对象的属性类型可以推断或显式提供:
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_a
,my_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']
属性。
但这并不是必需的。您的游乐场代码片段可以正确推断所有内容,并且不会引起类型错误。所以我会考虑这是否真的必要。