如何在TypeScript中声明仅包含对象而不包含函数的类型

时间:2018-10-07 20:27:27

标签: typescript typescript-typings typescript-types

在TypeScript中是否可以通过某种方式定义类型,使其仅包含对象但不包含函数?

示例:

function myFunction(input, e) {
  var filter, table, tr, td, i;
  filter = input.value.toUpperCase();
  table = document.getElementById("myTable");
  tr = table.getElementsByTagName("tr");
  for (var i = 0, t; t = tr[i]; ++i) {
    if (t.className !== 'header')
      t.style.display = 'none'
  }
  //start search only after Enter pressed
  if (e.key !== 'Enter')
    return;
  //and length >=3
  if (filter.length < 3) {
    alert("Search is going to work only if the phrase contains at least 3 characters.");
    return;
  }
  //continue with search here
  for (i = 0; i < tr.length; i++) {
    td = tr[i].getElementsByTagName("td")[1];
    if (td) {
      if (td.innerHTML.toUpperCase().indexOf(filter) > -1) {
        tr[i].style.display = "";
      }
    }
  }

}

感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

没有完美的方法来引用诸如“对象而不是函数的对象”之类的类型,因为这将需要真实的subtraction types,并且在TypeScript中不存在(至少从3.1开始)。

一个简单的解决方法是查看Function interface并描述肯定不是 Function但与大多数非功能对象匹配的对象很可能碰到。示例:

type NotAFunction = { [k: string]: unknown } & ({ bind?: never } | { call?: never });

这意味着“具有一些未指定键的对象,该对象缺少bind属性或call属性”。让我们看看它的行为:

const okayObject: NotAFunction = { a: "hey", b: 2, c: true };
const notOkayObject: NotAFunction = () => {}; // error, call is not undefined

好。

这是一种解决方法,而不是简单的解决方案,其原因是,某些非功能可能同时具有callbind属性,而这恰巧是偶然的,您会遇到不希望的情况错误:

const surprisinglyNotOkay: NotAFunction = { 
  publication: "magazine", 
  bind: "staples",
  call: "867-5309",
  fax: null
}; // error, call is not undefined

如果您确实需要支持此类对象,则可以将NotAFunction更改为更复杂并排除更少的非功能,但是可能总会出现定义错误的情况。由您how far you want to go决定。

希望有帮助。祝你好运!