Используйте общую строку в качестве ключа объекта

Я хочу определить объект O, который является общим для некоторого аргумента типа T extends string таким образом, чтобы у объекта O всегда был ключ со значением T.

type O<T extends string> = { [t in T]: string };

function f<T extends string>(t: T, o: O<T>) {
    const x = o[t];
    return x === "hello";
}

let s = f("a", { a: "" })

if (s === "Hello") {

}

Это то, что я пробовал, но на самом деле это не работает, поскольку O[T] не выводится как строка. Это означает, что последний if имеет ошибку, потому что сравнение TypeScript всегда будет false.

Ссылка на игровую площадку TypeScript

Что именно не работает? В этом коде нет ошибок, и вы можете аннотировать x, если хотите, как const x: string = o[t] без ошибок. В чем проблема?

jcalz 28.05.2019 04:06

Моя проблема заключается в том, чтобы аннотировать, чтобы получить правильный тип.

David Gomes 28.05.2019 05:09

Вы не имеют, чтобы аннотировать его, но тот факт, что вы могу, означает, что компилятор понимает, что O<T>[T] можно присвоить string. Если ваша проблема заключается в том, что проверка типа x в IntelliSense показывает O<T>[T] вместо string, то ваш вопрос должен объяснить, почему это проблема для вас. Это просто эстетика? Или какой-то код где-то действительно ломается из-за разницы? Прямо сейчас я просто вижу «это не работает» и «мне это не нравится» вместо минимальный воспроизводимый пример, поэтому мне сложно понять, что делать дальше. Удачи!

jcalz 28.05.2019 15:20

Проблема в том, что не присвоение строки приводит к ошибкам ниже. Приношу свои извинения, я должен был уточнить это в самом вопросе. Я отредактировал вопрос, чтобы отразить это. Во всяком случае, мне кажется очевидным, что присваивание строке является единственным правильным решением.

David Gomes 29.05.2019 08:27
Зод: сила проверки и преобразования данных
Зод: сила проверки и преобразования данных
Сегодня я хочу познакомить вас с библиотекой Zod и раскрыть некоторые ее особенности, например, возможности валидации и трансформации данных, а также...
Как заставить Remix работать с Mantine и Cloudflare Pages/Workers
Как заставить Remix работать с Mantine и Cloudflare Pages/Workers
Мне нравится библиотека Mantine Component , но заставить ее работать без проблем с Remix бывает непросто.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
TypeScript против JavaScript
TypeScript против JavaScript
TypeScript vs JavaScript - в чем различия и какой из них выбрать?
Синхронизация localStorage в масштабах всего приложения с помощью пользовательского реактивного хука useLocalStorage
Синхронизация localStorage в масштабах всего приложения с помощью пользовательского реактивного хука useLocalStorage
Не все нужно хранить на стороне сервера. Иногда все, что вам нужно, это постоянное хранилище на стороне клиента для хранения уникальных для клиента...
Что такое ленивая загрузка в Angular и как ее применять
Что такое ленивая загрузка в Angular и как ее применять
Ленивая загрузка - это техника, используемая в Angular для повышения производительности приложения путем загрузки модулей только тогда, когда они...
0
4
41
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

O[T] не будет напрямую отображаться как string, но будет вести себя как string во всех смыслах и целях:

type O<T extends string> = { [t in T]: string };

function f<T extends string>(t: T, o: O<T>) {
    let x = o[t];
    let s: string = x; // assignable to string 
    x = "S" // string can be assigned to it
    return x;
}
let s: string = f("a", {a: ""}) // outside it is string

Другие вопросы по теме