#typescript #types #phantom-types
Вопрос:
Я работаю с очень сложным API, и некоторые поля являются строкой ограничений (строка длиной X max). Поэтому я создал этот тип:
import {isString} from "lodash";
export type StringOfMaxLength<Max> = string amp; {
readonly StringOfMaxLength: unique symbol;
};
export const isStringOfMaxLength = <Max extends number>(s: string, m: Max): s is StringOfMaxLength<Max> => s.length <= m;
export const stringOfMaxLengthBuilder = <Max extends number>(
input: string,
max: Max,
): StringOfMaxLength<Max> => {
if (!isString(input)) {
throw new Error("the input is not a string");
}
else if (!isStringOfMaxLength(input, max)) {
throw new Error("The string is too long");
}
return input;
};
Это довольно хорошо работает, чтобы создать строку в нужном мне формате, но есть сделка,
Я должен заполнить объект этим типом, но максимальная длина каждого ключа может быть разной, и мне нужно знать, какова максимальная длина для записи в ключе объекта.
Exemple:
interface Obj {
randomKey: StringOfMaxLength<2>; // here it's 2 but I want to create a generic function that work with all value possible
};
const obj: Obj = {
randomKey: stringOfMaxLengthBuilder("hi", 2) // here it work but I have to specify the length and my objectiv is to not specify it
};
Если кто-то знает, как с этим справиться, большое спасибо ! 🙂
Комментарии:
1. Я не совсем понимаю, чего вы пытаетесь достичь. Это помогло бы, если
obj: Obj
бы был действительный машинописный текст (а такжеisString()
был определен или удален). Я думаю , вы надеетесь, чтоconst obj: Obj = {randomKey: magicFunction("hi")}
это будет действовать так, как еслиmagicFunction("hi")
бы это было вызваноstringOfMaxLengthBuilder("hi", 2)
, но это невозможно; во время выполнения это будетconst obj = {randomKey: magicFunction("hi")}
, и любая ссылка наObj
это была удалена. Все, что вы хотите, чтобы происходило во время выполнения, должно быть написано явно; после этого вы можете создавать типы для этого.2. @jcalz-это строка, пришедшая из lodash (моя ошибка); И да, функция магии (), о которой вы говорите, — это то, что я хочу. Поэтому я думаю, что я не могу этого сделать, и мне придется сохранить второй объект белого типа и максимальную длину каждого ключа, чтобы провести некоторое сравнение и проверить значения