Я собираюсь использовать обобщенные элементы для обеспечения того, чтобы тип 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
будет иметь тип string, а val2
будет иметь тип string, потому что именно так был определен первый элемент в массиве.
Я хочу, чтобы каждый элемент в массиве оценивалсянезависимо от того, удовлетворяет ли оно данным генерикам независимо.
Буду признателен за любую помощь!
ОБНОВЛЕНИЕ:
Спасибо за вашу помощь!Я ценю его!Я начинаю понимать использование extends, но у меня возникают проблемы с расширением его до моего фактического варианта использования:
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
Вот моя первая попытка изменить игровую площадку Typescript @jcalz для указанного выше вложенного варианта использования:
Детская игровая площадка