[英]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
是单一类型,称为联合类型。 您可以传递number
或string
,因为它们都是number | string
的子类型。 number | string
。 但你也可以传递任何number | string
number | string
。
类似地,在第二个示例中, T
不限于number
或string
; 可以是number | string
number | string
或number
或string
的任何子类型。 甚至
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.