如何使Pick属性局部化

时间:2019-02-25 12:36:57

标签: typescript typescript-pick typescript-partial

我有这个功能

[[ 0.06964055 -0.06541953 -0.00682676]]
[[ 0.005264   -0.03234607  0.00014838]]
[[ 1.617855e-04 -1.316892e-02  8.596722e-06]]
[[ 3.9425286e-06 -5.1347450e-03  7.5078127e-08]]
[[ 8.7508155e-08 -1.9560163e-03  6.3853928e-10]]
[[ 1.8867894e-09 -7.3784427e-04  5.8551406e-12]]
[[ 4.0385355e-11 -2.7728223e-04  5.3957669e-14]]

my imp

[[ 0.06964057 -0.06541953 -0.00682676]]
[[ 0.005264   -0.03234607  0.00014838]]
[[ 1.61785520e-04 -1.31689185e-02  8.59672610e-06]]
[[ 3.94252745e-06 -5.13474567e-03  7.50781122e-08]]
[[ 8.75080644e-08 -1.95601574e-03  6.38539112e-10]]
[[ 1.88678843e-09 -7.37844070e-04  5.85513438e-12]]
[[ 4.03853841e-11 -2.77282006e-04  5.39576024e-14]]

但是,我只想向function someThing(someArg: Pick<HTMLElement, 'id' | 'style'>) {...} 添加一些样式,而不是someArg.style中的所有样式。否则,该函数的输入将是巨大的。

所以我希望有CSSStyleDeclaration中的Pick,而不是Partial<CSSStyleDeclaration>中的Pick

我该怎么做?

1 个答案:

答案 0 :(得分:2)

由于您的类型比仅仅Pick从现有类型中添加一些属性要复杂得多,因此您可能希望在其自己的界面中将其拼写出来:

interface SomeArg {
  id: HTMLElement['id'],
  style: Partial<HTMLElement['style']>
}

function someThing(someArg: SomeArg) { }

someThing({id: "id", style: {
  zIndex: "1"
}})

我正在使用lookup types来明确说明idstyle属性与HTMLElement中的属性相关,但是您只能使用{{1} }和string

如果您确实需要使用Partial<CSSStyleDeclaration>之类的允许子属性为Pick的东西,则可以使一个mapped type来做,但是我不能从您的问题中得知您是否需要一些编程的东西。

更新

我想您确实希望它是编程的(尽管对于我自己不会打扰的两个属性),所以这是定义Partial的一种方法,以便您从PickPartial属性中进行选择属性本身。我假设您不需要递归(您不需要每个子属性本身就是Partial):

Partial

请注意,尽管从技术上讲,这使type PickPartial<T, K extends keyof T> = {[P in K]: Partial<T[P]>}; function someThing(someArg: PickPartial<HTMLElement, 'id'|'style'>) { } someThing({id: "1", style: { zIndex: "1" }}) 成为类型id,但这很好,因为映射的类型不会修改基元。Partial<string>只是Partial<string>。因此,string的类型与我上面阐述的someArg接口的类型相同。


希望有帮助。祝你好运!