gpt4 book ai didi

typescript : convert array union of ObjectId or string to an array of string

转载 作者:行者123 更新时间:2023-12-03 19:02:44 25 4
gpt4 key购买 nike

我有一个数组 foo类型:

foo: ObjectId[] | string[];
我需要将它分配给一个字符串数组 bar如下 :
let bar : string[] = foo.map( (e) => e.toString())
这应该是正确的,因为 ObjectIDstring类型有 toString()方法定义。但是,由于以下错误,上述代码未编译:
This expression is not callable.
Each member of the union type '(<U>(callbackfn: (value: ObjectId, index: number, array: ObjectId[]) => U, thisArg?: any) => U[]) | (<U>(callbackfn: (value: string, index: number, array: string[]) => U, thisArg?: any) => U[])' has signatures, but none of those signatures are compatible with each other.
我目前正在使用以下解决方法:
let bar : string[] = (foo as Array<string|ObjectID>).map( (e) => e.toString())
有没有更好的方法将混合类型的数组转换为字符串?

最佳答案

允许 foo.map()
如果您定义 foo 它将起作用带有一个签名,上面写着“它是一个字符串和 ObjectId 的数组,也是所有 ObjectId 或所有字符串的数组”。这感觉很傻,因为第二部分隐含了第一部分,但 typescript 不能那样工作。

foo: (ObjectId | string)[] & (ObjectId[] | string[]);
这比类型转换更好 as (ObjectId | string)[]因为我们不会丢失数组必须全部为一种类型的信息。但是有 (ObjectId | string)[]作为类型的一部分包含意味着可以映射。
您可以将其设为实用程序类型:
type ArrayOfEither<A, B> = (A | B)[] & (A[] | B[]);
通过函数映射 foo
如果您不能更改 foo 的类型,然后您可以在一个单独的函数中进行映射,该函数需要 foo作为论据。
这是有效的,因为原始签名 ObjectId[] | string[]非常具体,但它可以分配给更广泛的类型,例如 ArrayOfEither<ObjectId[], string[]>或只是 Stringable[] .
interface Stringable {
toString(): string;
}

const myFunction = ( array: Stringable[] ): string[] => {
return array.map(e => e.toString());
}

declare const foo: ObjectId[] | string[];

myFunction(foo); // no errors
Playground Link

关于 typescript : convert array union of ObjectId or string to an array of string,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64305480/

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