首页 > 解决方案 > 如何在打字稿中使用具有对象属性的数组

问题描述

有没有办法在不使用@ts-ignoretypescript的情况下使用具有对象属性的数组

假设我有这个函数,它尝试将数组转换为具有 prop 属性的数组。这很好用,除了它们是@ts-ignore

    const addPropToArray = <T extends unknown>(x: T[]): T[] & {prop: number} => {
      //@ts-ignore
      const y: T[] & {prop: number} = [...x];
      y.prop = 3;
      return y
    };

显然我不能这样做

const x: string[] & {prop:number} = // what could go here

就其本身而言,这就是为什么我正在考虑使用该函数,但即便如此,该函数也必须具有@ts-ignore.

具有对象属性的数组是一个糟糕的主意,以至于打字稿不能很好地支持它们,还是我缺少它们?

也许他们的一些变体可以起作用?

const x: string[] & {prop:number} = {...["a","b","c"], prop: 4}

显然这里的问题是它不再是一个数组。

编辑:我意识到我可以只使用值而不是使用@ts-ignore,但窗台似乎不是最好的解决方案

标签: arraystypescriptjavascript-objects

解决方案


显然我不能这样做const x: string[] & {prop:number} = // what could go here

如果您分配自执行匿名函数的返回值,您可以这样做。像这样的东西,例如:

interface ArrayProps {
    prop: number;
}

const x: string[] & ArrayProps = (() => {
    const xPartial: string[] & Partial<ArrayProps> = [];
    xPartial.prop = 3;

    return xPartial as string[] & ArrayProps;
})();

打字稿游乐场

不过,我不确定是否有办法在没有类型断言的情况下做到这一点。添加自定义类型保护而不是类型断言将需要考虑类型保护失败的路径,因此x最终也能够undefined或者取决于该路径的处理方式。


推荐阅读