如何简洁地让编译器知道一个值应该是什么类型并检查它?

莫内夫
function use(x: any){
  console.log(x);
}

type T = 'A' | 'B';

// consider all above fixed, do NOT change it in your answers (I am not asking about types in parameters of a function...)
// it only simulates what is in real code happening, it's just a minimal example

// works as I want, but requires temporary variable. clutters code quite a lot.
const a: T = 'C'; // <- crashes (compiler throws an error, desired behavior)
use(a);

// doesn't work - tsc happily compiles it and 'C' is assumed to be of type T
use(<T>'C');
use('C' as T);

我想要某种针对 I 类型的检查表达式。就像const(如果右侧不是那种类型,它会崩溃),但没有临时变量 - 最好是内联,类似地,“类型断言”(类型转换)现在是如何工作的。

Edit1:这显然不是一个真正的代码,我的问题是严格关于在我写的“不起作用”的位置强制执行类型检查。不要改变功能,认为它是固定的。我知道如何在函数/vars/lets/consts/interfaces 中使用类型,但这不是这个问题的内容。

编辑2:另一个例子:

const input: any = 'SomeRealValueB'; // this comes from unsafe place, can't be safely typed without runtime checks which I really don't want to do

// ^ that can't be changed

type SomeRealType = 'SomeRealValueA' | 'SomeRealValueB';

// my current solution I am not happy with (unnecessary variable and line of code)
const someRealValueA: SomeRealType = 'SomeRealValueA';
if(input == someRealValueA) { console.log('y'); }
else { console.log('n'); }

// why I want it typed - consider that after refactoring 'SomeRealValueB' gets changed to 'SomeRealValueC', I want compiler to chceck that for me
E_net4 山寨

正如字面所问,目前在 TypeScript 中没有内联编译时类型检查的语法。我想对这样的功能没有那么大的兴趣,因为你已经可以自己制作一个了:

function check<T>(x: T) { return x; }

以下几行将单独失败:

check<number>("five");
use(check<Ty>('C'));

但是,还必须注意的是,函数中缺乏适当的类型检查可能会隐藏一个单独的问题,因此,这里的函数是不可避免的。特别是,如果你的外部函数use接受一个参数 as any,而根据它自己的语义不应该,那么这只是一个糟糕的 TypeScript 声明,应该尽可能重新考虑和修复。否则,如果函数的声明无法更改,或者对参数类型的新限制只是您自己业务逻辑的一部分,那么您自己的应用程序应该将其包装到一个安全的、经过类型检查的函数中。

话虽如此,您目前有三个选择:(1)使用变量,就像您在问题中所做的那样;(2) 用预期的限制将函数包裹在一个新的声明中:

type Ty = 'A' | 'B';
const useTy: (x: Ty) => void = use;

useTy('C'); // Argument of type '"C"' is not assignable to parameter of type 'Ty'.

(3) 或者最后,由于函数本身是经过类型检查的,你可以像check上面的函数一样创建一个恒等函数并使用它。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么 typename 是必需的,即使它似乎足以推断名称应该是一个类型?

当编译器错误地认为类型应该是所有字符串时,如何对具有不同类型的记录列表进行排序?

如果我有一个使用yield的cdef或cpdef函数,应该是什么类型?

为什么 getWorkInfosForUniqueWork() 在它应该是唯一的时返回一个 WorkInfo 列表?

错误包含无效类型,它应该是一个对象,或者一个空的 docker-compose

对于接受一个函数并返回另一个返回线程句柄的函数的函数,类型签名应该是什么?

如果我想将 Power BI 函数用作我的报表的轴值,它的返回类型应该是什么

将xml反序列化为一个类。我想知道我的班级结构应该是什么

有谁知道它应该是什么角度?

如果piot是第一个或最后一个,则quck排序指针的位置应该是什么?

decltype(1,t)应该是左值引用吗?(编译器不同意)

Robotframework 如何做一个 TextField 值应该是 IN a Loop?

数组项的长度应该是不确定的,但是在调试器中它具有一个值

在将.toArray()用于Spark向量后,它应该是什么类型?

Tensorflor 模型的十进制输出,它应该是一个布尔值 (1/0)

交叉编译时,CMake的link.txt中的链接器命令应该是什么?

我如何通过读取 XSD 文件知道我的 XML 命名空间应该是什么?

一个纯CSS npm项目的切入点应该是什么?

你的项目的第一个提交/分支在 git flow 中应该是什么样子的

一个简单的 Node.js 应用程序的项目结构应该是什么样的?

使用SWIG的C函数的JNI包装器-类型映射应该是什么?

Micronaut 中反应式控制器方法的返回类型应该是什么?

GenMapFactory中的(elems:(A,B)*)应该是什么类型

为什么这应该是一个 while 语句而不是一个 if 语句?

无法移除复制的城镇。它应该是一个查询问题吗?

在某些情况下它没有任何值时,“到期日期”列类型应该是什么?(空白?空?0000-00-00?)

如何声明一个 Map<T, K> 哪个 T 应该是一个可变参数类而 K 应该是 T 的一个实例?

Java:如何编写`zip`函数?返回类型应该是什么?

如何让编译器说出它认为表达式是什么类型?