【发布时间】:2019-07-02 02:28:45
【问题描述】:
如何表达function 的签名,必须返回它接收(被调用)的参数(或this),在 TypeScript 中 ? 有没有一种编程语言可以做到这一点?*
// In TypeScript (or consider it pseudo-code)
class C {
// EXAMPLE 1 – Not polymorphic
chainable(x): this // MUST not only return some C,
{} // but the same instance it was called on
}
// EXAMPLE 2
function mutate<T>(a: T[], x): T[] // MUST return a, not a new Array
{
/* So that this doesn't compile */ return Array.from(a);
/* But this is OK */ return a;
}
相反,必须返回一个新实例的function 怎么样?
// EXAMPLE 3
function slice<T>(a: T[], x, y): T[] // MUST return a new Array
❌TypeScript
去 2?
下面的contract会实现上述吗?
contract referentiallyIdentical(f F, p P) {
f(p) == p
v := *p
}
type returnsSameIntSlice(type T, *[]int referentiallyIdentical) T
func main() {
var mutate returnsSameIntSlice = func(a *[]int) *[]int {
b := []int{2}
/* Would this compile? */ return &b
/* This should */ return a
}
}
C++20?
以上可以表示为C++concept吗?
✅斯卡拉
*最初,问题是关于在 TypeScript 中执行此操作,但由于这是不可能的,我很好奇它是否是另一种语言。
如果该语言的类型系统不能表达这一点,请随意删除标签
【问题讨论】:
-
恐怕返回只会匹配签名,它不会匹配确切的对象。
-
我认为 TypeScript 不支持您的要求。您正在定义返回值的 type,而不是 value 本身。我很想被证明是错误的。
-
这通常是您在测试套件中检查的内容(例如
assertEquals(a, sortInPlace(a))) -
@MTCoster 是的,但最好将其表达为类型签名的一部分。一些内置的 JavaScript 方法也可以这样工作
-
@Barry 这不是可以用 C++20 表达的东西吗
contracts?
标签: scala go flowtype type-systems