Как можно выразить подпись для 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
yTypeScript
Go 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
?
alaScala
* Первоначально вопрос был о том, как это сделатьв TypeScript, но так как это невозможно, мне любопытно, если это на другом языке.
Не стесняйтесь удалять тег, если система типов этого языка не может выразить это