gpt4 book ai didi

typescript - 如何在 TypeScript 中初始化具有额外属性的数组对象?

转载 作者:行者123 更新时间:2023-12-05 08:48:37 25 4
gpt4 key购买 nike

我需要创建以下类型的对象:

type ArrayWithA = [number, number, number] & { a: string };

我是这样做的:

const obj : any = [1, 2, 3];
obj.a = "foo";
const arrayWithA : ArrayWithA = obj as ArrayWithA;

问题:完成此任务的更好方法是什么(即不使用 any)?

奖励问题:什么是初始化类型对象的好方法:type FuncWithA = ((string)=>void) & { a: string }

最佳答案

我建议使用 Object.assign() ,这TypeScript's standard library表示返回所需形式的交集类型。有一点问题在于,要让编译器仅推断数组文字将是确切类型 [number, number, number] 的元组并不容易。如果您可以使用 readonly [number, number, number] 那么您可以使用 const assertion :

type ArrayWithA = readonly [number, number, number] & { a: string };
const arrayWithA: ArrayWithA = Object.assign([1, 2, 3] as const, { a: "foo" });

否则,您可以使用各种技巧:

type ArrayWithA = [number, number, number] & { a: string };

const arr: [number, number, number] = [1, 2, 3]; // annotate extra variable
let arrayWithA: ArrayWithA = Object.assign(arr, { a: "foo" });

// type assertion
arrayWithA = Object.assign([1, 2, 3] as [number, number, number], { a: "foo" });

// helper function
const asTuple = <T extends any[]>(arr: [...T]) => arr;
arrayWithA = Object.assign(asTuple([1, 2, 3]), { a: "foo" });

对于函数,你可以用 Object.assign() 做同样的事情:

type FuncWithA = ((x: string) => void) & { a: string }
let funcWithA: FuncWithA = Object.assign(
(x: string) => console.log(x.toUpperCase()),
{ a: "foo" }
);

但是您也可以只使用函数语句并稍后添加属性,因为 TypeScript 3.1 引入了 expando functions :

function func(x: string) {
console.log(x);
}
func.a = "foo"; // no error
funcWithA = func; // that works

Playground link to code

关于typescript - 如何在 TypeScript 中初始化具有额外属性的数组对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65690881/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com