Я создал тип объединения:
type RequestParameterType = number | string | boolean | Array<number>;
и у меня есть класс, который представляет собой пару ключ / значение, содержащую этот тип объединения:
class RequestParameter
{
constructor(name: string, value: RequestParameterType)
{
this.Name = name;
this.Value = value;
}
public Name: string;
public Value: RequestParameterType;
}
Затем я могу создать массив этого RequestParameter для хранения ключей / значений:
let parameters: Array<RequestParameter> = new Array<RequestParameter>();
parameters.push(new RequestParameter("one", 1));
parameters.push(new RequestParameter("two", "param2"));
Идея состоит в том, что я могу написать GetParameter
функцию для возврата типизированных значений из этого массива, которые на практике я бы, вероятно, использовал следующим образом:
// should return number type, with value 1
let numberParam: number | undefined = this.GetParameter<number>("one", parameters);
// should return string type, with value "param2"
let stringParam: string | undefined = this.GetParameter<string>("two", parameters);
// should return undefined, because param named 'two' is not number type
let undefinedParam: number | undefined = this.GetParameter<number>("two", parameters);
Однако у меня возникла проблема с моей функцией для получения типизированных параметров, потому что я не знаю, как проверить, что общий тип соответствует типу значения:
function GetParameter<T extends RequestParameterType>(parameterName: string, parameters: Array<RequestParameter>): T | undefined
{
let result: T | undefined = undefined;
for (let parameter of parameters)
{
// Type check fails: 'T' only refers to a type, but is being used as a value here.
if (parameter.Name === parameterName && parameter.Value instanceof T )
{
// Possibly an issue here too:
// Type 'RequestParameterType' is not assignable to type 'T | undefined'.
// Type 'string' is not assignable to type 'T | undefined'.
result = parameter.Value;
}
}
return result;
}
Я считаю, что мне может понадобиться написать функцию typeguard, но я пытаюсь точно так же проверить общий тип при написании typeguard. Возможно ли это решить?
Вот пример: на игровой площадке