gpt4 book ai didi

kotlin - 定位JavaScript时如何表示多种类型(联合类型)

转载 作者:行者123 更新时间:2023-12-02 12:29:09 26 4
gpt4 key购买 nike

我想做的是使用可以是其他三种类型之一的泛型类型。

这是一个带有函数的示例:

fun <T> get(key: String) : T where T: String, T: Number, T: Boolean {}

上面的代码不起作用,那么我应该怎么做呢?

最佳答案

对于KotlinJS,您可以使用ts2kt将TypeScript定义转换为Kotlin。它确实支持联合类型,但可能并非所有情况都是完美的。 tests for unionTypes in ts2kt阐明了它们现在的处理方式,并且在以JavaScript平台为目标时,您可以对正在手工创建的任何内容执行类似的操作。

在对issue #41 - to add better Union Type support的注释中提到了进一步的工作。最后,在该主题上至少有一个discussion thread指示:

In JS and TS in most cases union types used as the alternative to overloading, so in the near future, we going to use overloading for that when it possible. Also,​ we think about providing the additional way to specify union types for native declarations.



还有另一个有关此问题的Stack Overflow问题,并提供了一些当前选项: Kotlin and discriminated unions (sum types),其答案在所有Kotlin目标平台上均有效。

专门针对JavaScript目标,您可以考虑使用 dynamic type。我至少看到 one test case in ts2kt使用这种类型。此示例以以下TypeScript代码开头:

declare class Foo

type Key = Key2 | number;
type Key2 = string | Foo;
declare var fooKey: Key;

declare function barKey(a: Key|number);
declare function barList(a: List<Key>);
declare function barArray(a: Key[]);

interface Parent {
(...children: Key[]): Foo;
}

并使用 dynamic作为返回类型代替联合类型来生成此Kotlin;在其他情况下,重载方法签名以处理联合类型(我添加了一些注释):
external open class Foo

// using dynamic in place of union type
external var fooKey: dynamic /* String | Foo | Number */ = definedExternally

// using method overloading in place of union type
external fun barKey(a: String): Unit = definedExternally
external fun barKey(a: Foo): Unit = definedExternally
external fun barKey(a: Number): Unit = definedExternally

// using dynamic in place of union type
external fun barList(a: List<dynamic /* String | Foo | Number */>): Unit = definedExternally
external fun barArray(a: Array<dynamic /* String | Foo | Number */>): Unit = definedExternally

external interface Parent {
// using method overloading in place of union type
@nativeInvoke
fun invoke(vararg children: String): Foo
@nativeInvoke
fun invoke(vararg children: Foo): Foo
@nativeInvoke
fun invoke(vararg children: Number): Foo
}

但同样,您应该查看所有 ts2kt test cases for union types以查看其他想法,包括有关 undefined的处理。

关于kotlin - 定位JavaScript时如何表示多种类型(联合类型),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44395540/

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