Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Typescript 受参数类型约束的泛型函数_Typescript - Fatal编程技术网

Typescript 受参数类型约束的泛型函数

Typescript 受参数类型约束的泛型函数,typescript,Typescript,请遵守以下类型脚本代码: class cli<T extends string> {} let dist = function <T extends string>(m:T,c:cli<T>):void { }; let a:cli<"foo"> = new cli(); dist("bar",a); class cli{} 设dist=function(m:T,c:cli):void{ }; 设a:cli=new cli(); 区(“酒吧”,

请遵守以下类型脚本代码:

class cli<T extends string> {}
let dist = function <T extends string>(m:T,c:cli<T>):void {

};
let a:cli<"foo"> = new cli();
dist("bar",a);
class cli{}
设dist=function(m:T,c:cli):void{
};
设a:cli=new cli();
区(“酒吧”,a);
我想要的错误是“bar”不是“foo”,但是如果您实际检查,实际上没有错误,因为dist推断了类型参数
“foo”|“bar”
。我正在想办法解决这个问题

在我看来,一种方法是使
dist
函数成为
cli
的一种方法,但在我的实际应用程序中,这样做将。。。讨厌的


感谢您的帮助。

让它们共享相同的类型参数
T
意味着它们都受相同约束的约束,而不是由一个约束定义另一个约束的边界。如果希望
m
的类型受传递给
cli
的类型参数的限制,则应将它们指定为单独的类型参数,一个取决于另一个。例如:


let dist=function(m:U,c:cli):void{}

我不确定是否可以通过推断来实现。TypeScript中的类型系统是duck类型,它不像Java或C#中那样严格。由于
foo
bar
都是字符串,因此编译器将扩展它以使其工作。限制类型的一种方法是显式指定类型:
dist('bar',a)
。这将产生错误。但我想这不是你想要的。这样做的问题是,它依赖于用户使类型显式,所以它并不能真正避免你知道的任何错误。