惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

大猫的无限游戏
大猫的无限游戏
博客园 - 叶小钗
H
Help Net Security
P
Privacy & Cybersecurity Law Blog
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
Application and Cybersecurity Blog
Application and Cybersecurity Blog
Help Net Security
Help Net Security
Hugging Face - Blog
Hugging Face - Blog
D
Docker
Security Archives - TechRepublic
Security Archives - TechRepublic
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
V2EX - 技术
V2EX - 技术
人人都是产品经理
人人都是产品经理
L
LINUX DO - 最新话题
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
Google Online Security Blog
Google Online Security Blog
博客园 - 聂微东
WordPress大学
WordPress大学
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Latest news
Latest news
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
B
Blog RSS Feed
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
D
Darknet – Hacking Tools, Hacker News & Cyber Security
Blog — PlanetScale
Blog — PlanetScale
C
Cisco Blogs
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
Know Your Adversary
Know Your Adversary
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
爱范儿
爱范儿
Webroot Blog
Webroot Blog
宝玉的分享
宝玉的分享
Google DeepMind News
Google DeepMind News
D
DataBreaches.Net
Recent Commits to openclaw:main
Recent Commits to openclaw:main
The Register - Security
The Register - Security
Simon Willison's Weblog
Simon Willison's Weblog
A
Arctic Wolf
Scott Helme
Scott Helme
The Last Watchdog
The Last Watchdog
Y
Y Combinator Blog
Last Week in AI
Last Week in AI
S
Securelist
Cloudbric
Cloudbric
G
GRAHAM CLULEY
M
MIT News - Artificial intelligence
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
V
Visual Studio Blog
S
Schneier on Security
Engineering at Meta
Engineering at Meta

TypeScript

ts 生态有没有开源的简单的 kv 配置管理项目 - V2EX 你们是怎么学习 typescript 的? - V2EX 用 Go 移植的 TypeScript 7 要来了 - V2EX TypeScript5.9,仿佛走出草原来到了现代社会 - V2EX Typescript 有没有能对接 AI 的知识库或者文档?能处理稍微复杂点的类型 - V2EX typescript 如何返回一个动态对象类型 - V2EX ts 有没有直接能查看最终类型的方法 - V2EX TypeScript Native 预览版发布了 - V2EX 关于 TypeScript 装饰器和接口的问题,请教一下各位 - V2EX 你们 typescript 用自带枚举还是字符串枚举,感觉字符串枚举类型用起来有点不可靠啊 - V2EX effect-ts - V2EX typescript 达人乱入 - V2EX TypeScript 宣布原生移植计划,性能将提升 10 倍? - V2EX #笔记#更好的 ts 重载声明方法 - V2EX 使用 satisfies 实现穷举类型保护 - V2EX 请教一个 TS 问题,不知能否实现 - V2EX 装饰器能不能装饰类的所有方法 - V2EX TypeSciprt 类型推断,如何进一步收窄类型? - V2EX TypeScript 项目打包发布到 npm,如何给方法和接口添加 dts TypeScript 类型推导真强大。 - V2EX 为啥下面这段代码 TS 不报错 - V2EX ts 类型约束+请求参数校验+自动生成 openapi/swagger 文档,这三者目前有整合为一体的最佳实践吗 - V2EX 怎么每次碰到想不通的代码行都出在 TypeScript😢 这行到底哪里有问题? - V2EX 低估了 typescript 的难度 - V2EX 前端写 nestjs 后端,用 TypeORM 时感到非常困惑,不知道是不是我的理解有问题 - V2EX 我列举了市面上最好的几个 TypeScript 教程, 想深入学习 TypeScript 的同学以后不用走弯路了 - V2EX 这样的函数类型定义在 ts 里面叫什么? - V2EX typescript 如何忽略泛型参数啊? - V2EX TypeScript 现在的应用场景 - V2EX ==TypeScript 写的 npm 包可以用 javascript 使用包的函数吗 - V2EX react 如何优雅的实现批量删除+二次确认 - V2EX TypeScript 怎么 wrap 一个函数并修改一下返回值? - V2EX 想请教个 TypeScript 抽象类继承父类的问题。 - V2EX vscode 纯 js 项目有类型推断和成员变量提示,但是如果 ts 混用的话, js 导入就全变成 any 了,请问有办法解决吗 这个项目这样定义 Typescript 类型和使用,学到了,有几个问题? - V2EX 请教一个 Typescript 的问题 - V2EX 这种的类型是不是实现不了(TypeScript) - V2EX 问题一个 typescript 类型包裹问题 - V2EX 遇到了极其诡异的不符合进入 if 条件的要求但是还是进入了 - V2EX typescript 的类型处理 - V2EX 想问问大家 TypeScript 中关于 null 处理的方式 - V2EX 有没有声明 typescript 类型的好办法以及前端样式的健壮性问题 - V2EX typescript 类型断言问题 - V2EX TypeScript 中类型编程简介 - V2EX [求助] 类型 { K:V } --> { "type": K , "conf": V } 且约束 - V2EX 大佬们, vscode 开发 ts,这个地方的提示,怎么修改成中文啊 - V2EX TypeScript 中「类型定义的命名空间」使用 - V2EX 有没有办法把 ts 的 error 报错改成 warning - V2EX [求助] 函数中使用泛型缩小参数类型 - V2EX
TypeScript 能不能别这么古怪,这行为什么会报错呢? - V2EX
june4 · 2024-09-21 · via TypeScript

这是一个创建于 631 天前的主题,其中的信息可能已经有所发展或是发生改变。

type Obj = { xxxFoo?: number ,xxxBar?: number }
declare function func(obj: Obj): void
type Suffix = 'Foo'
const s: Suffix = 'Foo'
func({ 
    [`xxx${'Bar'}`]: 2, 
    [`yyy${'Foo'}`]: 2,  // 这行会报错,符合预期
    [`yyy${s}`]: 3, // 但这行为什么不会报错???!!!
    [`xxx${s}` satisfies keyof Obj]: 4 
})

为什么那行不会报错,和上一行到底有什么区别啊?我也是服了,所有上火的地方都上在 TypeScript 上。

nno

1

nno      2024 年 9 月 21 日

gpt 的回答
[yyy${s}]: 3 不报错原因:

在这里,TypeScript 看到的是一个动态计算的键名 yyy${s}。尽管 s 的值是 'Foo',它不会直接解析为 yyyFoo 。TypeScript 只知道这是一个字符串键,没有对该键进行进一步的类型检查,因此不会报错。

dfourc

2

dfourc      2024 年 9 月 21 日

确实,虽然 v2 不能贴 ai 的回答,这贴应该可以吧~
通义灵码和腾讯 ai 代码的回答:
['yyy${"Foo"}'] 报错是因为 "Foo" 被直接拼接成字符串,导致键名不是类型 Obj 中已知的键名。
['yyy${s}'] 不报错是因为 s 是类型 Suffix 的实例,TypeScript 会尝试推断 s 的值,从而认为它是安全的。

june4

3

june4      2024 年 9 月 21 日

@nno @galikeoy 感觉没这么简单
type Obj = { xxxFoo?: number ,xxxBar?: number }
type Suffix = 'Foo' | 'Bar'
function func(_obj: Obj): void {}
const s: () => Suffix = () => 'Foo'
const s2 = s()
const s3: Suffix = 'Foo'
// 这里,s2 和 s3 都是 Suffix 类型,那
func({ [`yyy${s2}` as const]: 3 })
func({ [`yyy${s3}` as const]: 3 }) // 为什么这行会报错而上一行不会呢?

june4

4

june4      2024 年 9 月 21 日

const s: () => Suffix = () => 'Foo'
const s2 = s()
const s3: Suffix = 'Foo'
const s4: Suffix = s2
func({ [`yyy${s2}` as const]: 3 })
func({ [`yyy${s3}` as const]: 3 }) // 就这行报错
func({ [`yyy${s4}` as const]: 3 })
为啥 s3 和 s4 的声明都一样类型,但一个报错一个不错,明面上的类型信息不代表全部还有个隐藏的部分?

civetcat

5

civetcat      2024 年 9 月 21 日

我试了一下,如果 s 变量不强制指定为 Suffix,让它自动推断是可以的。但是指定了 s 的类型,就无法推断成功了/。如果显示指定类型,ts 能判断出来一个不可变的字符串字面量类型,但是显示指定了 type 类型,导致 s 变成一个类型,但是这个类型是可变的?比如重新定义 Suffix 的类型为其他类型,可能是处于这种情况导致无法进一步推断?

xiangyuecn

6

xiangyuecn      2024 年 9 月 21 日

"yyyFoo" //编译时检查?
"yyy"+s //编译后的 js 狗都不理 ts 类型?

另外加一句,一定非要写这么奇怪的代码吗?

june4

7

june4      2024 年 9 月 21 日

@civetcat typescript 对参数明明有这个能力啊?

type Suffix2 = 'Foo' | 'Bar'
let sx: Suffix2 = 'Foo'
let sxf: () => Suffix2 = () => 'Foo'
function key(a: 'xxxFoo' | 'xxxBar') {}
key(`xxx${sx}`)
key(`yyy${sx}`) // 这行错,符合预期
key(`xxx${sxf()}`)
key(`yyy${sxf()}`) // 这行错,符合预期

这个能力放到对象键上就失效了?

june4

8

june4      2024 年 9 月 21 日

@xiangyuecn 这个代码不奇怪吧,业务上明明很多地方用到的。这些代码是我出错后简化而来的。
实际上,是我一个配置对象, { xxxOnMobile, xxxOnDesktop, yyyOnMobile, yyyOnDesktop ... }
这里 'OnMobile' | 'OnDesktop' 是后缀,这套 Template Literal 展开用于别的变量和参数上可以,但用在对象键上就不行了,我也很奇怪啊。

AV1

9

AV1      2024 年 9 月 21 日   ❤️ 1

TS 检查对象属性的时候,只会对多余的*字面量*( literal )属性报错。对于*非字面量*对象,以及*非字面量*属性,会按照*协变*规则判断类型是否符合规则。
原问题里的`yyy${s}`属于计算属性,它就相当于一个*多出来*的属性,并且不是字面量,所以不会报错。

let a: { a: number } = { a: 1 }
a = { a: 1, b: 2 } //字面量多了个 b ,报错

let ab: { a: number, b: number } = { a: 1, b: 2 }
a = ab //非字面量赋值,虽然多了个 b ,但符合协变规则,不报错

a = { a: 1, [Math.random()]: 6 } //虽然多了个属性,但它不是字面量,所以不报错

june4

10

june4      2024 年 9 月 21 日

@DOLLOR 你这个 Math.random 是运行时信息,当然无法报错了。但我那边明明是编译期可以确定的值。

lisongeee

11

lisongeee      2024 年 9 月 21 日

因为 typescript 没你想的这么智能

let x: number | undefined = undefined;
const run = (cb: Function) => cb();
run(() => (x = 1));
const y: typeof x = 1; // Type '1' is not assignable to type 'undefined'.

另外建议没必要过于纠结 typescript 的类型体操,比如我会尽量避免复杂类型,能用 interface 就不用 type

当然你要用特性什么想用就是了,如果觉得不好用,完全可以 fork 自己改一份,虽然大多数人没那能力

zbinlin

12

zbinlin      2024 年 9 月 21 日

还是 Typescript 类型推导还不够强大 /🐶

你如果声明一个这样的变量:

```
const obj = {
[`yyy${s}`]: 10,
};
```

你会发现 typescript 推导成:

```
{
[x: string]: number;
}
```
类型,这就解释了为什么这里 `yyy${s}` 不会报错。

你也可以像第四行那样,加上 `satisfies` 操作符来验证。

```
const obj = {
[`yyy${s}` satisfies keyof Obj]: 10,
};
```

当然,可以试试去 Github 的 Typescript 项目里问问,说不准可能是个 bug 。:)

lizy0329

13

lizy0329      2024 年 9 月 23 日

@june4
总的来说就是如果不是字面量,都需要使用一些额外的规则工具来约束

那为啥 JAVA 那边好像没什么人讨论类型?

june4

14

june4      2024 年 9 月 23 日

@lizy0329 ts 支持编译时字符串模板的,这个用法用在任何地方都行,就是用在这里的对象键上不行。
java 的类型就算了,灵活度很低,完全没有类型体操的余地,不可能有看不懂的地方。