Я хочу определить объект 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
.
Моя проблема заключается в том, чтобы аннотировать, чтобы получить правильный тип.
Вы не имеют, чтобы аннотировать его, но тот факт, что вы могу, означает, что компилятор понимает, что O<T>[T]
можно присвоить string
. Если ваша проблема заключается в том, что проверка типа x
в IntelliSense показывает O<T>[T]
вместо string
, то ваш вопрос должен объяснить, почему это проблема для вас. Это просто эстетика? Или какой-то код где-то действительно ломается из-за разницы? Прямо сейчас я просто вижу «это не работает» и «мне это не нравится» вместо минимальный воспроизводимый пример, поэтому мне сложно понять, что делать дальше. Удачи!
Проблема в том, что не присвоение строки приводит к ошибкам ниже. Приношу свои извинения, я должен был уточнить это в самом вопросе. Я отредактировал вопрос, чтобы отразить это. Во всяком случае, мне кажется очевидным, что присваивание строке является единственным правильным решением.
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
Что именно не работает? В этом коде нет ошибок, и вы можете аннотировать x, если хотите, как
const x: string = o[t]
без ошибок. В чем проблема?