Typescript можете ли вы получить параметры фантомного типа во время выполнения?

#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 (моя ошибка); И да, функция магии (), о которой вы говорите, — это то, что я хочу. Поэтому я думаю, что я не могу этого сделать, и мне придется сохранить второй объект белого типа и максимальную длину каждого ключа, чтобы провести некоторое сравнение и проверить значения