是否可以保证数组在Typescript中排序

是否可以保证数组在Typescript中排序,typescript,typing,Typescript,Typing,我想知道是否有可能创建一个类型来保证Typescript中数组的排序顺序 我觉得Flowtype可能可以通过“不透明”类型执行类似的操作,但我不确定是否有一个好的Typescript等价物 这正是我想要的: function foo(input: SortedArray<string>) { // Only accepts arrays that are sorted } const data = ['d', 'b', 'a']; foo(data); // fails s

我想知道是否有可能创建一个类型来保证Typescript中数组的排序顺序

我觉得Flowtype可能可以通过“不透明”类型执行类似的操作,但我不确定是否有一个好的Typescript等价物

这正是我想要的:

function foo(input: SortedArray<string>) {

  // Only accepts arrays that are sorted

}

const data = ['d', 'b', 'a'];
foo(data); // fails
sort(data);
foo(data); // doesn't fail
data.push('c');
foo(data); // fails again
功能foo(输入:SorterDarray){
//仅接受已排序的数组
}
常量数据=['d','b','a'];
foo(数据);//失败
排序(数据);
foo(数据);//没有失败
数据推送('c');
foo(数据);//再次失败
我并不希望这个片段能够正常工作,我也不希望Typescript“知道”数组是否在运行时排序。我只想让typescript保证:

  • 已对此数组调用sort()
  • 排序后数组未发生突变
sort
替换为任何其他函数,但您已经明白了

我认为“将数组标记为已排序”的一个非常类似的功能可能是“将字符串标记为有效url”


我不一定要引入新的基类型或扩展它们,我只想保证某个值已通过某些前置条件。我可能在这里使用了不正确的术语,但我觉得这在类型化lambda演算、haskell以及通过不透明类型的某种程度上贯穿流中是可能的。

您可以使用此模块中的优先级队列:您可以始终使用老式方法,即让一个类的构造函数在实例化时对数组进行排序。但就拥有一个本身强制执行前提条件的类型而言,我认为Typescript的功能还不够强大,无法做到这一点。你的意思是通过类型系统强制指定的值必须是一个排序数组?不,我认为不可能。你到底想看什么?您可以创建一个
SortedArray
类,该类在运行时以您想要的方式运行,并且只添加那些保持不变量的方法。你只是在找类型吗?我认为如果你写一些代码来解释你的用例会有所帮助:你希望看到什么编译没有错误,你希望看到什么产生编译器错误?感谢所有的反馈,我认为@SilvioMayolo是正确的,根本没有办法。我将添加一个我正在寻找的示例。有人可以用“这是不可能的”来回答这个问题,也许几年后可以添加一个新的答案;)您可以使用这个模块中的优先级队列:您可以始终使用老式的方法,使用一个类,其构造函数在实例化时对数组进行排序。但就拥有一个本身强制执行前提条件的类型而言,我认为Typescript的功能还不够强大,无法做到这一点。你的意思是通过类型系统强制指定的值必须是一个排序数组?不,我认为不可能。你到底想看什么?您可以创建一个
SortedArray
类,该类在运行时以您想要的方式运行,并且只添加那些保持不变量的方法。你只是在找类型吗?我认为如果你写一些代码来解释你的用例会有所帮助:你希望看到什么编译没有错误,你希望看到什么产生编译器错误?感谢所有的反馈,我认为@SilvioMayolo是正确的,根本没有办法。我将添加一个我正在寻找的示例。有人可以用“这是不可能的”来回答这个问题,也许几年后可以添加一个新的答案;)