typescript - 为什么 typescript 识别出对象的类型是字符串时,不让我将对象的值设置为字符串?

标签 typescript

我构建了一个函数,它接受一个对象和该对象的一个​​字符串键。但是在函数体中,它不会让我用不同的字符串设置对象的值。

const setAndGetString = <K extends string, T extends Record<Exclude<string, K>, any>>(
  obj: T & Record<K, string>,
  key: K
): string => {
  obj[key] = "foo" // Type 'string' is not assignable to type '(T & Record<K, string>)[K]'.
  return obj[key] // okay
}

有没有一种方法可以调整签名以使作业生效? (是的,我可以在作业中进行转换,但该解决方案不是很好)。

https://www.typescriptlang.org/play?ssl=7&ssc=2&pln=1&pc=1#code/MYewdgzgLgBBCmUCCYAmBxRBlKAnAlmAOYwC8MAPANIzwAeU8aEcehRANDACq0NOoWAJXihcqCgFE6wADYBXVPArQCxLlQB8XAIZgAnps0AKAFAwYIAEYArAFw8YAMhgixEql1Xtt5mAGt4fQcqUwBKB29iMk0YAG8-axsAbUD9AF0yGAAiADMQEGyYAHpinn0AB3gYAHIoohqYfBYwEFgdCAh8IjAdK1lqqBAYKErqmuNeFzcQcWovNmJNMOSqdJqAOj9cRHlcMEtbVKDM0st-HX1TAF8gA

最佳答案

你很接近。

考虑这个例子:

/**
 * Obtain a union of all values of record
 */
type Values<T> = T[keyof T]

/**
 * Obtain a union of all object keys which coresponds to strings
 */
type StringProperty<T> = Values<{
  [Prop in keyof T]: T[Prop] extends string ? Prop : never
}>

const setAndGetString = <
  Obj extends Record<PropertyKey, unknown>,
  Key extends StringProperty<Obj>
>(obj: Obj & Record<Key, string>, key: Key) => {
  const result = obj[key].charAt // ok
  return obj[key] // okay
}
const obj = {
  a: 'a',
  b: 42
}

setAndGetString(obj, 'a') // ok
setAndGetString(obj, 'b') // expected error

Playground

关于typescript - 为什么 typescript 识别出对象的类型是字符串时,不让我将对象的值设置为字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73885923/

相关文章:

javascript - TippyJS-React : how to open context-menu on right-click

javascript - 如何通过 JS 中的 WebPack 包提供全局 TypeScript 类

angular - 将选择选项转换为 bool 值

angular - 单击时更改按钮的背景颜色

javascript - 使用 Javascript 判断 CSS 类是否存在

javascript - 无法在 VS Code 中调试当前的 typescript 文件,因为找不到相应的 JavaScript

TypeScript 枚举转换/转换

typescript - 导入 google-cloud/storage 时无法调用类型缺少调用签名的表达式

angularjs - 使用 SystemJS 和 TypeScript 的 Angular 应用程序中的 "Unexpected token export"

reactjs - 无法将 RefObject<HTMLDivElement> 分配给 RefObject<HTMLElement> 实例