我有个功能
newText<T, U extends keyof T>(name: keyof T, value: T[U]){...}如果我用T调用它,它看起来像{ one: Function, two: string },类型应该看起来像'one' | 'two',值应该是Function | string。
这与我想要的非常接近,但是当我指定一个名称时,我希望值是该键的类型。因此,如果我做了newText('one',,我希望看到Function作为我唯一的值选项,并且执行newText('two', () =>{})应该会抛出一个错误。
这在打字本2.6中有可能吗?
完全用例与解决方案
type params = {
util?: Function;
utilName?: string;
other?: string;
};
type utilParams = 'util' | 'utilName';
class field {
name: string;
required: boolean;
value: any;
params: params;
constructor(name: string, required: boolean, value: any, params: params) {
this.name = name;
this.required = required;
this.value = value;
this.params = params;
}
}
type coreOptional<T, U extends keyof T> = {
required?: boolean;
value?: T[U];
};
class test<T> {
test<U extends keyof T>(name: keyof T, optional: coreOptional<T, U> & Partial<Pick<params, utilParams>>) {
let onlyParams: Partial<Pick<params, utilParams>> = { ...optional };
return new field(name, optional.required || false, optional.value, onlyParams);
}
}
let myTest = new test<{ one: Function; two: Function }>();
myTest.test('one', { value: '' }); //works!
myTest.test('one', { value: false}); //errors like it should.发布于 2017-11-13 23:38:40
因此,如果我执行newText('one‘),我希望将函数作为唯一的值选项,并且执行newText(’2‘,() =>{})应该会抛出一个错误。
简单:
type T = { one: Function, two: string };
declare function newText<KEY extends keyof T>(name: KEY, value: T[KEY]): any;
newText('one', () => null); // Okay
newText('two', () => null); // Error 干杯
https://stackoverflow.com/questions/47275260
复制相似问题