繁体   English   中英

语言不可知 - function 和构造函数参数中的允许类型

[英]Language Agnostic - Allowable types in function and constructor parameters

大多数(如果不是所有)静态类型语言都允许您为 function 或构造函数参数指定单一类型; 例如

function foo(x: string) { ... }

foo("hello")  // works
foo(123)      // error

TypeScript is a statically typed super-set of JavaScript, but since JavaScript is a dynamically typed language, TypeScript allows you to be a little more flexible; 例如,您可以指定多个允许的类型。

function foo(x: string | number) { ... }

foo("hello")  // works
foo(123)      // works
foo(true)     // error

此外,在 TypeScript 中,这允许您将泛型类型参数仅限制为特定类型; 例如:

class Foo<T extends number | string> {
    constructor(x: T) { ... }
}

new Foo("hello")  // works
new Foo(123)      // works
new Foo(true)     // fails

问题

我喜欢 TypeScript 将泛型类型参数仅限制为特定类型的能力,但我也希望能够在其他语言中做到这一点,即 C# 和 Kotlin,但据我所知,这些语言中没有等效的构造支持这样的约束。 如何用其他语言实现这一目标?

注意:我很乐意接受任何语言的答案,而不仅仅是列出的那些。 这更多是关于更高层次的思考和探索可以跨语言应用的其他途径。

C++20 有一个概念,它能够以你想要的方式约束模板参数,等等。 这在语言中引入了一些可以使用各种技术来近似的东西,在这里描述它们似乎来自 scope。

TypeScript 让你更灵活一点; 例如,您可以指定多个允许的类型。

不,你不能; number | string number | string是单一类型,称为联合类型。 您可以传递numberstring ,因为它们都是number | string的子类型。 number | string 但你也可以传递任何number | string number | string

类似地,在第二个示例中, T不限于numberstring 可以是number | string number | stringnumberstring的任何子类型。 甚至

var x = new Foo<123 | "">(123)

又在哪里123 | "" 123 | ""是一个完全普通的 TypeScript 类型。

Scala 3 将具有联合类型; 讨论了 Kotlin 的联合类型,但您可以看到团队不感兴趣。 对于 C#,类似

F#中有Sum / Union类型。 看起来很像TypeScript中的内容,但在F#中,它们是用用于匹配的标签定义的。
这使您可以使用具有多个相同类型案例的 sum 类型。 例如:

type ShoeSize = 
    | EU of double
    | UK of double
    | US of double

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM