TypeScript 中除了函数之外还有其他类型吗?

2024-01-03

我想表达的是,参数应该是一个对象或者简单的值类型(数字、布尔值、字符串等),而不是函数。

如果我使用Object,编译器让我分配一个函数。

var test: Object = () => "a";

如果我使用any,当然也是同样的结果。在这种情况下有什么类型或技巧可以帮助我吗?

我的根本目标是保证使用 Knockout 可观察量时的安全,这样我就不会忘记打开它们的那些小括号:)


新功能答案

2018 年 11 月添加 - 因为条件类型现在很流行!

条件类型为此提供了一个可能的解决方案,因为您可以创建一个NotFunction条件类型,如下图:

type NotFunction<T> = T extends Function ? never : T;

其工作原理如下:

const aFunction = (input: string) => input;
const anObject = { data: 'some data' };
const aString = 'data';

// Error function is not a never
const x: NotFunction<typeof aFunction> = aFunction;

// OK
const y: NotFunction<typeof anObject> = anObject;
const z: NotFunction<typeof aString> = aString;

唯一的弱点是您必须将变量放在语句的左侧和右侧 - 尽管如果您犯了错误,例如以下错误,也是安全的:

// Error - function is not a string
const x: NotFunction<typeof aString> = aFunction;

原答案

您可以使用提供运行时检查typeof,虽然不是编译时检查,但会捕获您忘记执行该函数的那些实例:

function example(input: any) {
    if (typeof input === 'function') {
        alert('You passed a function!');
    }
}

function someFunction() {
    return 1;
}

// Okay
example({ name: 'Zoltán' });
example(1);
example('a string');
example(someFunction());

// Not okay
example(function () {});
example(someFunction);

为什么你不能真正做你想做的事?

您几乎可以,因为您可以使用重载来允许“多种类型之一”,例如:

class Example {
    someMethod(input: number);
    someMethod(input: string);
    someMethod(input: boolean);
    someMethod(input: any) {

    }
}

问题来了:为了允许对象类型,您必须添加一个重载签名someMethod(input: Object); or someMethod(input: {});。一旦你这样做了,函数就会被允许,因为函数继承自对象。

如果你能缩小范围object对于不太通用的东西,您可以简单地为您想要允许的所有类型添加越来越多的重载(哎呀)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

TypeScript 中除了函数之外还有其他类型吗? 的相关文章

随机推荐

  • CSRF 令牌在登录期间过期

    我正在开发 Spring Web 应用程序 我需要避免登录页面上的 csrf 令牌过期问题 因为如果用户等待太长时间并尝试登录 解决 csrf 问题的唯一方法是重新加载页面并尝试再次登录 但这对用户不友好 我想避免这种情况 第一个问题 一般
  • 有什么方法可以以编程方式选择 TextView 中的文本吗?

    我有一个TextView我希望允许用户搜索特定的字符串 如果找到该字符串 它应该突出显示 使用背景跨度太慢而且很尴尬 所以我想弄清楚是否可以让它选择字符串 我知道与EditText这可以使用setSelection 但我不希望用户能够编辑文
  • 富文本框到字符串

    我有一个绑定到菜单项的富文本框 以允许粗体 斜体和下划线以及剪切 复制和粘贴 但是如何获取 RichTextBox 内容并将其从代码隐藏转换为字符串哪个将带有粗体 斜体等
  • 使用 Alamofire 处理超时

    是否可以为 Alamofire 请求添加超时处理程序 在我的项目中 我这样使用 Alamofire init let configuration NSURLSessionConfiguration defaultSessionConfigu
  • 我需要将 constexpr 放在 else-if 之后吗?

    灵感来自这个答案 https stackoverflow com a 52355930 7151494 我尝试复制并粘贴 并在中添加测试main 这段代码 template
  • Perl 5 中存在哪些伪运算符?

    我目前正在记录 Perl 5 的所有运算符 请参阅佩洛普夫 http github com cowens perloprefGitHub 项目 我决定也包含 Perl 5 的伪运算符 对我来说 Perl 中的伪运算符是任何看起来像运算符的东
  • C - 取消引用空指针

    我正在尝试创建自己的交换函数 但遇到了麻烦 为什么我收到 取消引用空指针 void ft swap void a void b size t nbytes unsigned char cur a unsigned char cur b si
  • IBM Worklight - 页面碎片

    我正在尝试将现有的phonegap 项目迁移到worklight 中 Phonegap 应用程序使用 mobile changePage 进行页面导航 这个函数会重新加载现有的 DOM 还是创建一个新的 DOM 由于worklight建议使
  • yii2详细视图条件行类

    我想根据条件更改详细视图中单个属性的类 如果我不想让它成为有条件的 它会像这样工作 attribute gt ungueltig format gt boolean contentOptions gt class gt danger 我希望
  • 无法调试 dotnet core GenericHost docker 容器

    我在最新的 Windows 版本 Windows 10 2004 上使用 Linux 容器 并启用了 WSL 2 和 Docker Desktop 2 3 0 3 45519 我右键单击 docker compose 文件 然后选择Set
  • Android:将数组保存到应用程序数据

    是否可以将整个数组 甚至ArrayList 保存到android应用程序数据中 据我所知 你只能做像 putInt putBoolean 或 putString 这样的事情 但是更复杂的数据类型呢 有没有办法做到这一点 或者我是否必须先将整
  • C 通用数组实现

    我正在尝试在 C 中实现通用数组列表 但是 当数据类型是 int 以外的任何类型时 列表将不会包含正确的数据 例如 像 123 1234 作为双精度数 当将双精度数传递到列表中时 它将变成 000 0000 一 当数据类型为int时 它将有
  • python中如何输入输入的数字

    我想内联输入 1 input number 5 2 1 5 3 4 2 python中如何接收输入数量的输入 我已经尝试过这样的 num int input inputs num mlist for i in range num n int
  • 如何将 Hive 与 Power BI 连接

    我无法将 Hive 视为 power BI 中列出的数据源 有没有办法将Hive数据库与power bi桌面连接 还有有什么限制吗 应在系统中安装并配置 Hive ODBC 驱动程序 以便与 Power BI 连接 成功配置 ODBC 驱动
  • AngularJS 事件未从 $rootScope 触发

    我遇到了 rootScope broadcast 事件未被触发的问题 App run function rootScope var text Not So Static Now rootScope broadcast event stati
  • 在 Android 中使用经过训练的 Scikit-learn svm 分类器 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我正在开发一个 Android 应用程序 它使用手机中的传感器数据对活动进行分类 与任何 Java 机器学习库相比 我也更喜欢 sci
  • C#中有“记录”吗?

    我希望将一些客户数据存储在内存中 我认为最好的方法是使用记录数组 我不确定这是否是 C 中的名称 但基本上我可以调用Customer i Name并将客户姓名作为字符串返回 在图灵中 它是这样完成的 type customers recor
  • 将成绩单 .srt 文件解析为可读文本

    我有一个视频脚本 SRT 文件 其中包含传统 SRT 格式的线条 这是一个例子 1 00 00 00 710 gt 00 00 03 220 Lorem ipsum dolor sit amet consectetur adipisicin
  • java.lang.AbstractMethodError:当我尝试使用 nexmo(vonage) API 发起出站语音呼叫时出现此异常

    我的 pom xml 用于所有相关的依赖项 没有其他依赖项在内部使用以下依赖项
  • TypeScript 中除了函数之外还有其他类型吗?

    我想表达的是 参数应该是一个对象或者简单的值类型 数字 布尔值 字符串等 而不是函数 如果我使用Object 编译器让我分配一个函数 var test Object gt a 如果我使用any 当然也是同样的结果 在这种情况下有什么类型或技