【问题标题】:Typescript select string properties [duplicate]打字稿选择字符串属性[重复]
【发布时间】:2021-09-06 03:29:59
【问题描述】:

我试图弄清楚如何正确键入一个show 函数,该函数将采用一个对象T 和一个键KT[K] 可以保证实现toString() 方法。

这是我使用映射类型的尝试

type ToStringablePropertyKeys<T> = keyof {
    [K in keyof T]: { toString(): string }
}

function show<T, K extends ToStringablePropertyKeys<T>>(t: T, k: K): string {
    return t[k].toString()
}

但是编译器说Property 'toString' does not exist on type 'T[K]'.

我在这里缺少什么?我如何让tsc 相信toString 实际上是根据K 的定义存在的?

【问题讨论】:

  • 这有什么用?在 JavaScript 中,每个原始值和对象都有一个 toString 方法。
  • 由于编译器抱怨toString 不存在,我假设存在没有toString 的有效属性。无论哪种方式,我都可能想将相同的模式应用于比toString 不太常见的东西:如果我想保证T[K] 是给定类型V 怎么办?
  • @Clashsoft null 没有toString()... 也没有undefined
  • 请参阅the answer 到这个重复的问题以获取更多信息;在这里翻译该代码会产生this...祝你好运!
  • @jcalz,谢谢,这帮助很大!

标签: typescript tsc


【解决方案1】:

另一种方法:

function show<K extends string, T extends {[key in K]:{toString(): string}}>
(t: T, k: K ): string {
return t[k].toString()
}

【讨论】:

  • 开箱即用的好想法!
【解决方案2】:

这是一个几乎理想的解决方案。尽管 typescript 可以强制将键仅作为在 {toString():string} 上扩展的键,但从那里推断出这一点还不够聪明,所有 T[k] 都将具有 toString():string...

type ToStringable = { toString(): string };

type ToStringablePropertyKeys<T> = {
    [k in keyof T]: T[k] extends ToStringable ? k : never
}[keyof T];

function show<T, K extends ToStringablePropertyKeys<T>>(t: T, k: K): string {
    return (t[k] as any).toString(); // it seems typescript is not smart enough to infer that all t[k] will have toString
}

const testObject = {
    string: 'test',
    number: 123,
    null: null,
    undefined: undefined,
};

show(testObject, 'number');
show(testObject, 'string');
show(testObject, 'invalid-prop'); //this fails
show(testObject, 'null'); //this fails
show(testObject, 'undefined'); //this fails

https://www.typescriptlang.org/play?ts=4.3.4#code/C4TwDgpgBAKg9gZWAJwJYDsDmBDARgG2gF4oBvKYRFDTACgEoAuKAZ2qygF8BuAKF9CRYVNFjyEACsjiRkoANIQQLADwwAfFBKleUPVADaAaygYoRpXABmsALrMYx21AgAPYBHQATFsKSicAmgAfnMoZnQIADcIZF5OY0sbGFs+XisAV3QAY2BUOHRWAAs4AHc1ABooeRd3Tx8-dkDJaVkFJVUNdVpgByqjZnkmViayXX1kCGAM5EKepyhsX2x0EHoAOkp-GgZuKAB6fdNgVggIAFtfQQgWbLQwE9RfdDgTlnPsORcXjMwiijgpnQVliFCK2BO2Hw+AoC1KqGhUHBMQB2yw8X42QKbAoN2AAHlcAArCC5LRjfQjALMADkHjYNIq4z06Ay51wsWYAEYAEwAZiZlNZ0IiGWhgv0WS8ECsGAgXmYUplcq8TJ4-BYJVKPTxhJJuSqNNZ7NiNPofE1ZR1bD1pOAhrYATNFq11oJxLthowUShqC8AFowK1nQd9sAik8oFZsAiWLxLdr6e79faoEaxfgQ4dw5Ho7H466k7aDWmlbLIl4s2GI748-g40A

【讨论】:

  • 好吧,看来演员还是有必要的,我以为我漏掉了什么。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-03
  • 2019-04-18
  • 2017-05-03
  • 2016-09-20
  • 1970-01-01
  • 2016-11-01
相关资源
最近更新 更多