gpt4 book ai didi

typescript - 如何描述该函数通过引用改变对象?

转载 作者:行者123 更新时间:2023-12-04 11:02:06 25 4
gpt4 key购买 nike

我有一个通过引用修改对象的函数:

function addProp(object, value) {
object.foo = value;
}

如何告诉 TypeScript object调用 addProp 后值改变了它的类型功能?我期望这样的代码:
interface WithProp<T> {
foo: T;
}

function addProp<T1 extends object, T2>(object: T1 mutatesTo (T1 & WithProp<T2>), value: T2) {
object.foo = value;
}

const obj = { bar: 'baz' };
obj.foo; // TS: error
addProp(obj, 123);
obj.foo; // TS: ok

最佳答案

类型系统并不真正适合改变变量的类型。它确实使用了 control flow analysis缩小变量的类型,至少在某些代码块中,但直到最近还没有办法写addProp()触发这种基于控制流的缩小。

TypeScript 3.7 引入 assertion functions表示不返回值但防止无效状态的函数。它们非常新,有一些 weird restrictions ,所以请注意。

但是你现在可以做的是代表addProp()作为一个断言函数,表示 T1 类型的输入现在被断言为更窄的类型 T1 & WithProp<T2> .在这种情况下,如果输入不是该类型,则函数实现不会抛出错误,而是通过添加属性使其成为该类型。但是对于类型系统来说都是一样的。无论如何,它看起来像这样:

function addProp<T1 extends object, T2>(
o: T1,
value: T2
): asserts o is T1 & WithProp<T2> {
(o as T1 & WithProp<T2>).foo = value;
}

然后它会按照您想要的方式运行:
let obj = { bar: 'baz' };
obj.foo; // error! foo does not exist on {bar: string}
addProp(obj, 123);
obj.foo; // okay

请注意,这种缩小是控制流分析的结果,它在分配时被重置,所以你可能会惊讶于以下不起作用(注意我在上面放了 let 而不是 const):
// weirdness on reassignment
obj = { bar: "baz", foo: 1 }; // error! foo is extra

但这是我能在类型系统中表示此类突变的最接近的方法。好的,希望这会有所帮助;祝你好运!

Link to code

关于typescript - 如何描述该函数通过引用改变对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58741643/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com