如何在typescript中仅克隆类型属性
假设我有代码:如何在typescript中仅克隆类型属性,typescript,Typescript,假设我有代码: type SimpleState = { a1: string // little more properties } type ComplexState = SimpleState & { b1: numeric, c1: boolean // many other properties } const workingState :ComplexState = // all properties initialozation const statePar
type SimpleState =
{
a1: string
// little more properties
}
type ComplexState =
SimpleState
& {
b1: numeric,
c1: boolean
// many other properties
}
const workingState :ComplexState = // all properties initialozation
const stateParam :SimpleState = workingState;
cacheSimpleState(stateParam)
在运行时cacheSimpleState接收具有所有属性的ComplexState对象。有没有办法将workingState克隆到stateParam,使其仅具有SimpleEstate属性?不幸的是,没有。Typescript无法在运行时检查接口成员 一个选项是手动列出道具,尽管不是很花哨:
函数cacheSimpleState(数据:T):SimpleState{
返回{
a1:data.a1
}
}
这样,如果SimpleState
需要更多数据,至少您的构建会知道。
但是,如果出现可选参数,则需要小心。
一种选择是:
类型SimpleState=
{
a1:字符串;
b1?:字符串;
}
const defaultSimpleState:SimpleState={//所有必需的道具
a1:“”
}
const defaultOptionalState:SimpleState={//所有可选的道具
…不动产,
b1:'
}
函数cacheSimpleState(数据:T):SimpleState{
让props:Partial={};
for(让道具插入数据){
if(道具处于defaultSimpleState | |道具处于defaultOptionalState){
props={…props[prop]:数据[prop]};
}
}
归还道具作为财产;
}
不幸的是,没有。Typescript无法在运行时检查接口成员
一个选项是手动列出道具,尽管不是很花哨:
函数cacheSimpleState(数据:T):SimpleState{
返回{
a1:data.a1
}
}
这样,如果SimpleState
需要更多数据,至少您的构建会知道。
但是,如果出现可选参数,则需要小心。
一种选择是:
类型SimpleState=
{
a1:字符串;
b1?:字符串;
}
const defaultSimpleState:SimpleState={//所有必需的道具
a1:“”
}
const defaultOptionalState:SimpleState={//所有可选的道具
…不动产,
b1:'
}
函数cacheSimpleState(数据:T):SimpleState{
让props:Partial={};
for(让道具插入数据){
if(道具处于defaultSimpleState | |道具处于defaultOptionalState){
props={…props[prop]:数据[prop]};
}
}
归还道具作为财产;
}
函数不需要使用泛型t,因为它们不使用t的任何附加属性,并且扩展SimpleEstate的任何t都可以分配给SimpleEstate。它可以只是一个接受SimpleState并返回SimpleState的函数。(虽然我可以从可读性的角度看到使用“extends”的好处)。我之所以使用泛型T,是因为我想确保SimpleState
中的任何强制属性都将位于data
中,并且类型正确,函数cacheSimpleState(数据:SimpleState)不是这样吗:SimpleState
也是吗?我想在这种情况下,您将面临索引问题。我做了一个测试,让元素隐式地具有“any”类型,因为类型为“string”的表达式不能用于索引类型为“SimpleState”
errorHuh。你说得对,但那真的很奇怪!我不明白为什么prop
在for(让prop进入数据)
中的类型是Extract
fort
,而不仅仅是string
,而string
的类型是SimpleState
。我想我今天学到了一些新的东西。函数不需要使用泛型t,因为它们没有使用t的任何附加属性,并且扩展SimpleEstate的任何t都可以分配给SimpleEstate。它可以只是一个接受SimpleState并返回SimpleState的函数。(虽然我可以从可读性的角度看到使用“extends”的好处)。我之所以使用泛型T,是因为我想确保SimpleState
中的任何强制属性都将位于data
中,并且类型正确,函数cacheSimpleState(数据:SimpleState)不是这样吗:SimpleState
也是吗?我想在这种情况下,您将面临索引问题。我做了一个测试,让元素隐式地具有“any”类型,因为类型为“string”的表达式不能用于索引类型为“SimpleState”
errorHuh。你说得对,但那真的很奇怪!我不明白为什么prop
在for(让prop进入数据)
中的类型是Extract
fort
,而不仅仅是string
,而string
的类型是SimpleState
。我想我今天学到了一些新东西。