const a = {
b: "hello",
c: "world",
}
function f(x: keyof typeof a | { x: string }) {
}
function g(x: string) {
if (a.hasOwnProperty(x)) {
return f(x);
} else {
return f({ x });
}
}
g
函数接受字符串x
。如果x
是a
的键("b"
或"c"
),则它应使用f
作为唯一参数来调用x
函数。如果x
不是a
的键,则g
函数必须使用其中带有f
字符串的对象来调用x
函数。
但是,此代码在调用f(x)
函数时出错。看来TypeScript无法理解,在使用hasOwnProperty
之后,x
字符串是a
的键。是否可以通过某种方式使TypeScript理解 而无需使用类型声明?
答案 0 :(得分:4)
我建议使用type guard:
function isInA(x: string): x is keyof typeof a {
return a.hasOwnProperty(x);
}
if (isInA(x)) {
return f(x);
}