在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 = "";
}
}
}
}
感谢您的帮助。
答案 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
好。
这是一种解决方法,而不是简单的解决方案,其原因是,某些非功能可能同时具有call
和bind
属性,而这恰巧是偶然的,您会遇到不希望的情况错误:
const surprisinglyNotOkay: NotAFunction = {
publication: "magazine",
bind: "staples",
call: "867-5309",
fax: null
}; // error, call is not undefined
如果您确实需要支持此类对象,则可以将NotAFunction
更改为更复杂并排除更少的非功能,但是可能总会出现定义错误的情况。由您how far you want to go决定。
希望有帮助。祝你好运!