这是一个例子:
const initObject = {
a: 0,
b: 0,
c: 0
}
const { a, ...rest } = initObject
Run Code Online (Sandbox Code Playgroud)
我们a从对象中省略属性,但随后const a为它分配了一个值,但从未使用过-eslint(无未使用的变量)产生错误。是否可以完全省略const a?
在传递空对象的情况下,对象解构会引发错误
function test ({name= 'empty'}={}) {
console.log(name)
}
test(null);Run Code Online (Sandbox Code Playgroud)
未捕获的类型错误:无法解构
name“未定义”或“空”的属性。在测试 (:1:15) 在 :1:1
我收到以下错误:
type Union = { type: "1"; foo: string } | { type: "2"; bar: number };
function doSomething = (object: Union) => {
const { foo } = object
// ^ TS2339: Property 'foo' does not exist on type 'Union'.
console.log(object.bar)
// ^ TS2339: Property 'bar' does not exist on type 'Union'.
}
Run Code Online (Sandbox Code Playgroud)
期望的结果:
typeof foo === string | undefined
typeof bar === number | undefined
Run Code Online (Sandbox Code Playgroud)
如何在没有显式类型保护的情况下访问属性,例如:
const foo = o.type === 1 ? o.foo : undefined
const bar …Run Code Online (Sandbox Code Playgroud) 在 ES6 JS 中解构对象时,您可以使用{ a, b }语法从该对象创建新变量,分别调用a和b。但是,据我所知,无法获取对象的键以自动创建具有这些名称的本地范围变量。在下面的例子中,我希望能够使用的假设的伪代码const {} = args;,它会产生const a和const b自动。
const bar = { a: 'apple', b: 'ball' };
const foo = (args) => {
const { a, b } = args;
console.log(a, b); // Great!
const {} = args; // I am aware this isn't valid syntax...
console.log(a, b) // Because of course, it doesn't work.
};
foo(bar);
Run Code Online (Sandbox Code Playgroud)
原因纯粹是因为,在这个 MCVE 之外,我实际上使用了一个带有数十个键的大型对象,我想将其中的某些值传递到 Promise 链的下一部分。我当然可以使用 …
使用ES6,您可以在函数参数中构造对象:
({name, value}) => { console.log(name, value) }
Run Code Online (Sandbox Code Playgroud)
等效的ES5将是:
function(params) { console.log(params.name, params.value) }
Run Code Online (Sandbox Code Playgroud)
但是,如果我想什么了一个既参考params对象和嵌套的属性value和name?这是我得到的最接近的,但缺点是它不能用于箭头函数,因为它们无法访问该arguments对象:
function({name, value}) {
const params = arguments[0]
console.log(params, name, value)
}
Run Code Online (Sandbox Code Playgroud) 在Chrome版本中,^72如果我运行以下内容JavaScript,则没有错误.
{ prop: p } = { prop: 'prop' }
>> { prop: 'prop' }
Run Code Online (Sandbox Code Playgroud)
因此意外地将代码行解释为表达式语句.
但是,如果我在结尾处使用分号运行相同的代码,它将按预期运行.
{ prop: p } = { prop: 'prop' };
>> Uncaught SyntaxError: Unexpected token =
Run Code Online (Sandbox Code Playgroud)
这是预期的,因为初始{告诉JavaScript引擎它是一个代码块,除非我们用括号消除歧义.
为什么这会出现在分号上但不是没有呢?
javascript syntax google-chrome destructuring object-destructuring
我正在尝试传播错误,以便我可以在不影响原始错误的情况下更改错误。
const error = new Error('Error test');
const freeError = {...error};
console.log(error, freeError);Run Code Online (Sandbox Code Playgroud)
但输出是一个空对象{}。我期待freeError至少有一个 message 属性,但没有。
这是 JavaScript 功能的一部分还是我的代码或引擎有问题?
我知道解决这个问题的方法,但它需要额外的工作{...error, message: error.message}。所以,是的,我所需要的只是澄清一下,这样我就可以确定我没有遗漏任何东西。谢谢你。
当我开始输入时,VSCode 可以自动完成 JSDoc,/**这很好,它甚至可以填充一些参数。
但是a)它将所有参数默认为*b)当我在函数定义中解构对象时它没有帮助。
例如,如果我有
const FloopThePig = ({pigCount, floopStrength}) => { ...
Run Code Online (Sandbox Code Playgroud)
然后自动完成 JSDoc 给我:
/**
* @param {*} param0
*/
const FloopThePig = ({pigCount, floopStrength}) => { ...
Run Code Online (Sandbox Code Playgroud)
当我真的想将其定制为类似的东西时
/**
* @param {object} props
* @param {unknown} props.pigCount
* @param {unknown} props.floopStrength
*/
const FloopThePig = ({pigCount, floopStrength}) =>
Run Code Online (Sandbox Code Playgroud)
我并不认为它必须是“未知”的,而是除了 之外的其他东西*,并且记录解构的参数是我一直在努力寻找的。
这可能吗?如果可能的话,如何实现?
javascript intellisense jsdoc visual-studio-code object-destructuring
我有一个像下面这样的减少功能:
let el = scopes.reduce ((tot, {actions}) => tot + actions.length, 0);
Run Code Online (Sandbox Code Playgroud)
我试图这样改造它,但似乎它不是正确的方法:
let el = scopes.reduce ((tot, {actions.length: len}) => tot + len, 0);
Run Code Online (Sandbox Code Playgroud)
有没有办法做到这一点,或者这是不可能的。
javascript ×9
ecmascript-6 ×5
eslint ×1
intellisense ×1
jsdoc ×1
object ×1
prettier ×1
reactjs ×1
syntax ×1
typescript ×1
union-types ×1