Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.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,有没有办法强制函数只能使用可选类型调用 其中可选的定义为 type Optional<T> = T | undefined 类型可选=T |未定义 我想定义一个函数f,这样 declare type Foo = { foo: string } declare var x: Optional<Foo> declare var y: Foo f(x) // ts typecheck ok f(y) // ts typecheck ko 声明类型Foo={Foo:st

有没有办法强制函数只能使用可选类型调用

其中可选的定义为

type Optional<T> = T | undefined
类型可选=T |未定义
我想定义一个函数f,这样

declare type Foo = { foo: string }
declare var x: Optional<Foo>
declare var y: Foo

f(x) // ts typecheck ok
f(y) // ts typecheck ko 
声明类型Foo={Foo:string}
声明变量x:可选
声明变量y:Foo
f(x)//ts类型检查正常
f(y)//ts类型检查

据我所知,这是可行的:

declare function f<T>(v:Optional<T> extends T ? T : never) : any;
声明函数f(v:可选扩展T?T:从不):any;

操场

但为什么?通常,如果一个函数可以处理
T | undefined
,那么
T
应该可以。我想键入检查,以确保泛型函数只能在可选值上调用。这是不可能的。因为union总是由一个值表示,该值在您的示例中为T或未定义。这两个值都是此类型的有效值确实不可能阻止
Foo
分配给
Optional
,但问题要求
f
签名,就我所知,只要
Optional
不分配给
Foo
,就可以编写这样的函数。请看下面我的答案。