【发布时间】:2019-09-21 12:46:10
【问题描述】:
我希望使用泛型来强制val1 的类型应该与数组中每个元素的val2 的类型相匹配。
interface SameTypeContainer<T> {
val1: T,
val2: T;
}
test([
{
val1: 'string',
val2: 'also string'
},
{
val1: 5,
val2: false // expect to throw error since type is not number
}
]);
function test(_: SameTypeContainer<any>[]) { }
这不会导致错误。我希望这会引发打字稿错误,原因如下:
在传递给测试函数的数组的第二个元素中,val1 是一个数字,val2 是一个字符串。 SameTypeContainer 接口应该强制val1 的类型与val2 的类型匹配。
接下来我尝试重新定义测试函数以使用泛型:
function test<T>(_: SameTypeContainer<T>[]) { }
现在我收到一个错误,但原因是错误的。编译器期望val1 为字符串类型,val2 为字符串类型,因为这是数组中第一个元素的定义方式。
我希望评估数组中的每个元素是否独立满足给定的泛型。
任何帮助将不胜感激!
更新:
感谢您的帮助!我很感激!我开始了解如何使用扩展,但无法将其扩展到我的实际用例:
export type Selector<S, Result> = (state: S) => Result;
export interface SelectorWithValue<S, Result> {
selector: Selector<S, Result>;
value: Result;
}
export interface Config<T, S, Result> {
initialState?: T;
selectorsWithValue?: SelectorWithValue<S, Result>[];
}
export function createStore<T = any, S = any, Result = any>(
config: Config<T, S, Result> = {}
): Store<T, S, Result> {
return new Store(config.initialState, config.selectorsWithValue);
}
export class Store<T, S, Result> {
constructor(
public initialState?: T,
public selectorsWithValue?: SelectorWithValue<S, Result>[]
) {}
}
const selectBooleanFromString: Selector<string, boolean> = (str) => str === 'true';
const selectNumberFromBoolean: Selector<boolean, number> = (bool) => bool ? 1 : 0;
createStore({
selectorsWithValue: [
{ selector: selectBooleanFromString, value: false },
{ selector: selectNumberFromBoolean, value: 'string' } // should error since isn't a number
],
});
要求:对于传递给createStore 函数的数组中的每个元素,selector 的第二个类型应该与value 的类型匹配。
例如:如果selector 属性是Selector<boolean, number> 类型,则value 属性应该是number 类型,与数组类型的其他元素无关。
这是我第一次尝试修改为上述嵌套用例提供的 Typescript Playground @jcalz:
【问题讨论】:
标签: typescript typescript-generics