如果不在某个地方使用any,我无法检查下面的函数类型。
export function makeToggleState<T, K extends keyof T>(obj: {new(): T}, prop: K) {
return (state: T, show: boolean|null = null) => {
if (show === null) {
state[prop] = !state[prop]
} else {
state[prop] = show
}
}
}
class State {
value = true
}
makeToggleState(State, 'value')我得到了这个错误:
Type 'false' is not assignable to type 'T[K]'.
Type 'false' is not assignable to type 'T[string]'.
(parameter) prop: K extends keyof T告诉编译器我需要K extends keyof T和T[K] is boolean的最好方法是什么?
发布于 2017-07-09 23:54:37
没有办法在状态声明中使用这个约束,但是您可以为它返回的函数声明它,使用T和mapped type T & {[n in K]: boolean}的交集作为状态参数。
export function makeToggleState<T, K extends keyof T>(obj: {new(): T}, prop: K) {
return (state: T & {[n in K]: boolean}, show: boolean|null = null) => {
if (show === null) {
state[prop] = !state[prop]
} else {
state[prop] = show
}
}
}
class State {
value = true;
name = 'q';
}
const toggleValue = makeToggleState(State, 'value');
const s = new State();
toggleValue(s)
const toggleName = makeToggleState(State, 'name'); // ok
// but does not compile when you try to use it
toggleName(s);
//Argument of type 'State' is not assignable to parameter of type 'State & { name: boolean; }'.
// Type 'State' is not assignable to type '{ name: boolean; }'.
// Types of property 'name' are incompatible.
// Type 'string' is not assignable to type 'boolean'.https://stackoverflow.com/questions/44995497
复制相似问题